日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux 之免交互操作

發布時間:2025/3/19 linux 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux 之免交互操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、Here Document免交互

1.1 免交互定義

Here Document 概述:

使用I/O重定向的方式將命令列表提供給交互式程序或命令,比如 ftp、cat 或 read 命令

Here Document 是標準輸入的一種替代品,可以幫助腳本開發人員不必使用臨時文件來構建輸入信息,而是直接就地 生產出一個文件并用作命令的標準輸入,Here Document 可以與非交互式程序和命令一起使用

1.2 語法格式

語法格式

命令 << 標記

....

輸入內容

......

標記

Here Document 使用注意事項:

?標記可以使用任意的合法字符(通用的字符是EOF) ?結尾的標記一定要頂格寫,前面不能有任何字符(包括空格) ?結尾的標記后面也不能有任何字符(包括空格) ?開頭標記前后空格會被省略掉 ?

1.3 實例

1.直接把輸入的命令行輸出 ?2.將輸入的內容保存到文件 ?3.追加內容輸入保存到文件

1.4 Here Document 變量設定

Here Document 也支持使用變量,如果標記之間有變量被使用,會先替換變量值。如 果想要將一些內容寫入文件,除了常規的方法外,也可以使用 Here Document。如果寫入 的內容中包含變量,在寫入文件時要先將變量替換成實際值,在結合 cat 命令完成寫入

示例:

1.在寫入文件時會先將變量替換成實際值,再結合cat 命令完成寫入 ?2.支持變量替換 在寫入文件時會先將變量替換成實際值,再結合 cat 命令完成寫入

[root@localhost ~]# vim kk.sh

#!/bin/bash

doc_file="yy.txt"

i="0.0"

cat > $doc_file << EOF

kuai le $i

EOF

echo ?this is $i

[root@localhost ~]# chmod +x kk.sh

[root@localhost ~]# ./kk.sh

this is 0.0

[root@localhost ~]# cat yy.txt

kuai le 0.0

3.整體賦值給一個變量,然后通過 echo 命令將變量值打印出來

[root@localhost ~]# vim kk.sh

#!/bin/bash

ar="So Happy"

arr=$(cat << EOF

放假

$ar

EOF

)

echo $arr

[root@localhost ~]# chmod +x kk.sh

[root@localhost ~]# ./kk.sh

放假 So Happy

1.5 格式控制

關閉變量替換的功能,按照字符原本的樣子輸出,不做任何修改或替換

示例:

1.關閉變量替換: 對標記加單引號,即可關閉變量替換 ?

[root@localhost ~]# vim kk.sh

#!/bin/bash

i="hello"

kk=$(cat <<'EOF'

$i

EOF

)

echo $kk

[root@localhost ~]# chmod +x kk.sh

[root@localhost ~]# ./kk.sh

$i

1234567891011121314

?2.去掉每行之前的 tab 字符 在第一行的標記前面加 ‘-’,這個表示要抑制各行首 tab 的作用

[root@localhost ~]# vim kk.sh

#!/bin/bash

cat <<EOF

????????hello world

EOF

cat <<-EOF

????????hello world

EOF

[root@localhost ~]# chmod +x kk.sh

[root@localhost ~]# ./kk.sh

hello world

hello world

1234567891011121314

1.6 多行注釋

Bash 的默認注釋是 “#” ,該注釋方法只支持單行注釋,在shell 腳本的工作中,"#"右側的任何字符串,bash都會將其忽略。Here Document 的引入解決了多行注釋的間題。 " : " (冒號) 代表什么都不做的空命令。中間標記區域的內容不會被執行,會被bash 忽略掉,因此可達到批量注釋的效果.

[root@localhost ~]# vim kk.sh

#!/bin/bash

a=123456

: <<-EOF

this is

test line

echo $a

EOF

echo "0.0"

[root@localhost ~]# chmod +x kk.sh

[root@localhost ~]# ./kk.sh

0.0

二、Expect

2.1 Expect 定義

?建立在tcl之上的一個工具 ?用于進行自動化控制和測試 ?解決shell腳本中交互相關的問題 ?

2.2 Expect 安裝

rpm -q expect

rpm -q tcl

yum install -y expect

12345

2.3 Expect 相關命令

腳本解釋器

expect 腳本中首先引入文件,表明使用的事哪一種shell#!/usr/bin/expect

spawn

spawn后面通常跟一-個Linux執行命令,表示開啟一個會話、啟動進程,并跟蹤后續交互信息 例: spawn passwd root

expect

判斷上次輸出結果中是否包含指定的字符串,如果有則立即返回,否則就等待超時時間后返回;只能捕捉由spawn啟動的進程的輸出;用于接收命令執行后的輸出,然后和期望的字符串匹配

send

?向進程發送字符串,用于模擬用戶的輸入; ?該命令不能自動回車換行,一般要加\r (回車)或者\n ?

結束符

1.expect eof

?表示交互結束,等待執行結束,退回到原用戶,與spawn對應 ?比如切換到root用戶,expect腳本默認的是等待10s當執行完命令后,默認停留10s后,自動切回了原用戶 ?

2.interact

1.執行完成后保持交互狀態,把控制權交給控制臺, 會停留在目標終端而不會退回到原終端,這個時候就可以手工操作了,interact后的命.令不起作用;

?比如interact后添加exit,并不會退出root用戶。而如果沒有interact則登錄完成后會退出,而不是留在遠程終端上。 ?使用interact會保持在終端而不會退回到原終端; ?

set

?expect 默認的超時時間是10秒,通過set 命令可以設置會話超時時間,若不限制超時時間則應設置為-1 ?例子: set time out 30 ?

exp_continue

exp_ continue 類似于控制語句中的continue 語句。表示允許expect 繼續向下執行指令

send_users

表示回顯命令與echo相同

接收參數

expect 腳本可以接受從bash命令行傳遞參數,使用 [lindex $argv n]獲得。其中你從0開始,分別表示第一個,第二個,第三個…參數

set hostname [lindex $argv 0] 相當于hostname=$1

set password [lindex $argv 1] 相當于passswd=$2

2.4 實例

1.ssh無交互登錄到遠程服務器

[root@localhost ~]# vim kk.sh

#!/usr/bin/expect

spawn ssh root@192.168.146.10

expect {

????????"password:"

????????{ send "123456\r"; }

}

interact

[root@localhost ~]# chmod +x kk.sh

[root@localhost ~]# ./kk.sh

spawn ssh root@192.168.146.10

root@192.168.146.10's password:

Last login: Mon Feb 14 12:12:35 2022 from 192.168.146.20

[root@localhost ~]#

2.在遠程登錄的服務器上進行操作后再退出

[root@localhost ~]# vim kk.sh

#!/usr/bin/expect

spawn ssh root@192.168.146.10

expect {

????????"password:"

????????{ send "123456\r"; }

}

expect "#"

send "ls\r"

send "ifconfig ens33\r"

send "exit\r"

expect eof

[root@localhost ~]# chmod +x kk.sh

[root@localhost ~]# ./kk.sh

spawn ssh root@192.168.146.10

root@192.168.146.10's password:

Last login: Mon Feb 14 16:42:02 2022 from 192.168.146.20

[root@localhost ~]# ls

anaconda-ks.cfg ?initial-setup-ks.cfg

[root@localhost ~]# ifconfig ens33

ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> ?mtu 1500

????????inet 192.168.146.10 ?netmask 255.255.255.0 ?broadcast 192.168.146.255

????????inet6 fe80::33b3:2fac:9c4b:5e89 ?prefixlen 64 ?scopeid 0x20<link>

????????ether 00:0c:29:01:3e:a5 ?txqueuelen 1000 ?(Ethernet)

????????RX packets 210547 ?bytes 310074122 (295.7 MiB)

????????RX errors 0 ?dropped 0 ?overruns 0 ?frame 0

????????TX packets 98024 ?bytes 5939781 (5.6 MiB)

????????TX errors 0 ?dropped 0 overruns 0 ?carrier 0 ?collisions 0

[root@localhost ~]# exit

登出

Connection to 192.168.146.10 closed.

?3.ssh 免交互登錄的第二種寫法

[root@localhost ~]# vim kkk.sh

#!/usr/bin/expect

set timeout 10

log_file kkk.log

log_user 1

set ip [lindex $argv 0]

set password [lindex $argv 1]

spawn ssh root@${ip}

expect {

????????"(yes/no)"

????????{send "yes\r"; exp_continue} "*password"

????????{send "$password\r"}

}

interact

??

[root@localhost ~]# chmod +x kkk.sh

[root@localhost ~]# ./kkk.sh 192.168.146.10 123456

spawn ssh root@192.168.146.10

root@192.168.146.10's password:

Last login: Mon Feb 14 21:57:36 2022 from 192.168.146.20

[root@localhost ~]# ??????

[root@localhost ~]# vim yong.sh

#!/bin/bash

username=$1

useradd $username

/usr/bin/expect <<-EOF

spawn passwd $username

expect {

????????"密碼"

????????{send "123456\r";exp_continue}

????????"新的密碼"

????????{send "123456\r";}

}

EOF

[root@localhost ~]# chmod +x yong.sh

[root@localhost ~]# ./yong.sh nan

spawn passwd nan

更改用戶 nan 的密碼 。

123456

新的 密碼:

無效的密碼: 密碼少于 8 個字符

重新輸入新的 密碼:

passwd:所有的身份驗證令牌已經成功更新。

[root@localhost ~]# vim ftp.sh

#!/usr/bin/expect -f

set timeout 10

spawn ftp 192.168.146.10

expect "Name*"

send "ftp\r"

expect "Passwd:*"

send "\r"

expect "ftp>*"

interact

[root@localhost ~]# chmod +x ftp.sh

[root@localhost ~]# ./ftp.sh

spawn ftp 192.168.146.10

Connected to 192.168.146.10 (192.168.146.10).

220 (vsFTPd 3.0.2)

Name (192.168.146.10:root): ftp

331 Please specify the password.

Password:

230 Login successful.

Remote system type is UNIX.

Using binary mode to transfer files.

ftp>

總結

以上是生活随笔為你收集整理的linux 之免交互操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。