① 在shell(#!/bin/sh)腳本中怎麼使用expect命令,需要添加什麼環境變數嗎,正確即給分
1、首先檢查你機器上有沒有expect(我知道ubuntu默認是沒有安裝的)
ls /usr/bin | grep expect 看看有沒有裝expect
2、沒有的話需要安裝
在ubuntu的軟體安裝中心,搜索tcl 和tk 和expect並安裝;
也可以命令行輸入sudo apt-get install tcl tk expect
3. 環境ready了後,可以在shell腳本中用Here document的方式使用expect命令
例子參見:http://..com/question/397085991.html
Here document格式如下:
expect <<!
這中間都是expect命令
!
為防止錯誤,建議都頂格寫,前面不要留空格。
② linux的expect代碼,發現如果不加interact,則send命令好像沒有執行,如果加上interact命令才執行。
常見的做法是將interact換成 expect eof ,從而可以捕獲到spawn命令啟動的進程的結束狀態。
如果堅持使用interact可以在命令執行完成後依然保持在登陸在遠程伺服器上,可以直接手工敲命令進行交互,完成後續工作,最後需要exit退出ssh遠程登陸。
至於去掉interact卻沒有使用expect eof的情況下send沒有執行的問題,主要是因為因為spawn會啟動一個進程,但是沒有捕獲匹配eof或者time out事件造成的
③ 使用 expect 的時候,怎麼使用shell的命令啊
expect 用的是 tcl 語言,你可以用
exec sleep 1
if { [file isfile certs/cert.key] } {
send_user "file existing"
} else {
send_user "file not existing"
}
更多細節可以去學一下 tcl 語言。
④ expect學習之如何獲取命令行參數和函數參數
比如下面腳本用來做ssh無密碼登陸,自動輸入確認yes和密碼信息,用戶名,密碼,hostname通過參數來傳遞
ssh.exp
Python代碼
#!/usr/bin/expect
set timeout 10
set username [lindex $argv 0]
set password [lindex $argv 1]
set hostname [lindex $argv 2]
spawn ssh--id -i .ssh/id_rsa.pub $username@$hostname
expect "yes/no"
send "yes\r"
expect "password:"
send "$password\r"
expect eof
執行腳本./ssh.exp root pasword hostname1
expect接收參數的方式和bash腳本的方式不太一樣,bash是通過$0 ... $n 這種方式,而expect是通過set <變數名稱> [lindex $argv <param index>],例如set username [lindex $argv 0]
⑤ windows expect怎麼使用
你是說shell的expect么,我有個ssh自動登錄的腳本,你看下1. [#!/usr/bin/expect]
2. [set timeout 30]
基本上認識英文的都知道這是設置超時時間的,現在你只要記住他的計時單位是:秒
3. [spawn ssh -l username 192.168.1.1]
spawn是進入expect環境後才可以執行的expect內部命令,如果沒有裝expect或者直接在默認的SHELL下執行是找不到spawn命令的。所以不要用 「which spawn「之類的命令去找spawn命令。好比windows里的dir就是一個內部命令,這個命令由shell自帶,你無法找到一個dir.com 或 dir.exe 的可執行文件。
它主要的功能是給ssh運行進程加個殼,用來傳遞交互指令。
4. [expect "password:"]
這里的expect也是expect的一個內部命令,有點暈吧,expect的shell命令和內部命令是一樣的,但不是一個功能,習慣就好了。這個命令的意思是判斷上次輸出結果里是否包含「password:」的字元串,如果有則立即返回,否則就等待一段時間後返回,這里等待時長就是前面設置的30秒
5. [send "ispass\r"]
這里就是執行交互動作,與手工輸入密碼的動作等效。
溫馨提示: 命令字元串結尾別忘記加上 「\r」,如果出現異常等待的狀態可以核查一下。
6. [interact]
執行完成後保持交互狀態,把控制權交給控制台,這個時候就可以手工操作了。如果沒有這一句登錄完成後會退出,而不是留在遠程終端上。如果你只是登錄過去執行
⑥ expect什麼意思
expect意思是期望;指望;認為;預料;期待;預期。
expect的基本意思是「期待」「料想」,指相信或盼望有人會來或有事會發生,這種預料多有一定的根據,強調的是客觀可能性,多用於好的方面,在口語中expect的意思常淡化為「認為」「想」,此時主語多為第一人稱單數。
expect多用作及物動詞,可接名詞、代詞、動詞不定式或that從句作賓語,也可接以動詞不定式充當補足語的復合賓語。
expect所接的that從句在表示「預料」「期望」時可用虛擬式,在作「想」「認為」解時可用陳述式,that有時可以省略。
(6)expect命令擴展閱讀:
desire,wish,hope,expect,want,long這些動詞都有「希望」之意。
1、desire語氣較正式莊重,著重渴望的力量與熱切,常含有強烈的意圖和目的。
2、wish語氣較弱,多指難於實現或不可能實現的願望。
3、hope指對願望實現有一定信心的希望。
4、expect通常指有很大程度的把握,但仍含有預料之意,或預計某事或某行動的發生。
5、want一般指所想要的東西是切望得到的東西,能彌補實際需要。
6、long語氣強,指極殷切地盼望著,這種盼望側重於很難或不可能得到的東西。有時也指一般願望,但含一定感情色彩。
⑦ linux expect講解怎麼使用
[root@zuozhang PYTHON_TEST]# rpm -ql expect package expect is not installed 查看是否有安裝,如果沒有安裝安裝一個即可。 yum install expect*
⑧ expect如何將命令結果賦值給變數
改成 send 「exit \$ret\r」 ret 變數是 ssh 到遠端後shell裡面定義的 (即你之前的send "ret=`echo $?`\r") ,所以要把 $ 用 \ 轉意,否則 $ret 指的是 expect 里的ret變數,你在 expect 里當然沒有定義過這個變數了,所以出錯。
⑨ 如何判斷expect中調用的命令是否成功
set time 300應該是set timeout 300吧。你可以在set timeout命令前面或者後面加一條命令:log_file /tmp/expect.log復制代碼然後從log裡面看命令是否執行成功了。回復 1# baochenggood
⑩ linux遠程重啟windows
安裝步驟:
1、進入鏈接下載最新 OpenSSH-Win64.zip(64位系統),解壓至C:Program FilesOpenSSH
2、打開cmd,cd進入C:Program FilesOpenSSH(安裝目錄),執行命令:
powershell.exe -ExecutionPolicy Bypass -File install-sshd.ps1
3、設置服務自動啟動並啟動服務:
sc config sshd start= auto
net start sshd
到此服務已經安裝完畢,默認埠一樣是22,默認用戶名密碼為Window賬戶名和密碼,當然防火牆還是要設置對應埠允許通訊
修改設置:
通常linux下會修改ssh_config文件來修改ssh配置,但在安裝目錄並沒有發現這個文件,查閱官方wiki後發現,原來是在C:ProgramDatassh目錄下(此目錄為隱藏目錄)
埠號:Port 22
密鑰訪問:PubkeyAuthentication yes
密碼訪問:PasswordAuthentication no
空密碼:PermitEmptyPasswords no
然後進入C:Users賬戶名.ssh目錄,創建authorized_keys公鑰文件(也可在ssh_config修改路徑)(僅限7.7之前版本,7.9版本請看最後更新)
設置完成後重啟sshd服務,接下來就可以使用Xshell等工具使用密鑰連接了~
踩過的坑:
命令行不識別空格時:C:Program Files用C:Progra~1替代
Windows Service2012R2即使配置了.ssh/authorized_keys公鑰,連接時依然顯示沒有注冊公鑰。。。
查閱了官方wiki判斷可能是許可權問題:Fix SSH file permissions
進入C:Program FilesOpenSSH(安裝目錄),右鍵 FixHostFilePermissions.ps1【使用PowerShell運行】,命令行提示全選是,重啟sshd服務後密鑰連接正常
2019.5.17更新:
新部署伺服器的時候,發現公鑰無法注冊,發現新版本有變動:
執行的命令為: