![](/img/trans.png)
[英]Provide password to ssh command inside bash script, Without the usage of public keys and Expect
[英]Use Expect in a Bash script to provide a password to an SSH command
我正在嘗試在 Bash 腳本中使用 Expect 來提供 SSH 密碼。 提供密碼有效,但我沒有像我應該的那樣進入 SSH 會話。 它回到海峽回到 Bash。
我的腳本:
#!/bin/bash
read -s PWD
/usr/bin/expect <<EOD
spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com'
expect "password"
send "$PWD\n"
EOD
echo "you're out"
我的腳本的輸出:
spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com
usr@$myhost.example.com's password: you're out
我想要我的 SSH 會話,並且只有當我退出它時,才能返回到我的 Bash 腳本。
我之所以在 Expect 之前使用 Bash,是因為我必須使用菜單。 我可以選擇連接到哪個單元/設備。
對於那些想回復我應該使用 SSH 密鑰的人,請棄權。
混合使用 Bash 和 Expect 並不是達到預期效果的好方法。 我會嘗試只使用預期:
#!/usr/bin/expect
eval spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com
# Use the correct prompt
set prompt ":|#|\\\$"
interact -o -nobuffer -re $prompt return
send "my_password\r"
interact -o -nobuffer -re $prompt return
send "my_command1\r"
interact -o -nobuffer -re $prompt return
send "my_command2\r"
interact
bash 的示例解決方案可能是:
#!/bin/bash
/usr/bin/expect -c 'expect "\n" { eval spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com; interact }'
這將等待Enter ,然后返回(片刻)交互式會話。
在 EOD 之前添加“interact” Expect 命令:
#!/bin/bash
read -s PWD
/usr/bin/expect <<EOD
spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com
expect "password"
send "$PWD\n"
interact
EOD
echo "you're out"
這應該讓您與遠程機器進行交互,直到您注銷。 然后你會回到 Bash。
在為這個問題尋找了幾個月的答案后,我終於找到了一個真正最好的解決方案:編寫一個簡單的腳本。
#!/usr/bin/expect
set timeout 20
set cmd [lrange $argv 1 end]
set password [lindex $argv 0]
eval spawn $cmd
expect "assword:" # matches both 'Password' and 'password'
send "$password\r";
interact
把它放到/usr/bin/exp
,然后你可以使用:
exp <password> ssh <anything>
exp <password> scp <anysrc> <anydst>
完畢!
一個簡單的 Expect 腳本:
#!/usr/bin/expect
set user [lindex $argv 1]
set ip [lindex $argv 0]
set password [lindex $argv 2]
spawn ssh $user@$ip
expect "password"
send "$password\r"
interact
例子:
./Remotelogin.exp <ip> <user name> <password>
還要確保使用
send -- "$PWD\r"
相反,因為以破折號 (-) 開頭的密碼將失敗。
以上不會將以破折號開頭的字符串解釋為發送命令的選項。
使用輔助工具fd0ssh
(來自 hxtools,而不是 pmt)。 它無需期待來自ssh
程序的特定提示即可工作。
我發現使用 Bash 腳本中的小型Expect 腳本有用的另一種方法如下。
...
Bash script start
Bash commands
...
expect - <<EOF
spawn your-command-here
expect "some-pattern"
send "some-command"
...
...
EOF
...
More Bash commands
...
這是有效的,因為...If the string "-" is supplied as a filename, standard input is read instead...
如果您嘗試在Sublime Text構建目標中,在 Makefile 中使用它, sshpass
被破壞。 取而代之的sshpass
,您可以使用passh
: https://github.com/clarkwang/passh
使用sshpass
你會這樣做:
sshpass -p pa$$word ssh user@host
使用passh
你會這樣做:
passh -p pa$$word ssh user@host
注意:不要忘記使用-o StrictHostKeyChecking=no
。 否則,連接將在您第一次使用時掛起。 例如:
passh -p pa$$word ssh -o StrictHostKeyChecking=no user@host
參考:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.