簡體   English   中英

在 Bash 腳本中使用 Expect 為 SSH 命令提供密碼

[英]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 ,然后返回(片刻)交互式會話。

最簡單的方法是使用sshpass 這在Ubuntu / Debian存儲庫中可用,您不必處理與 Bash 集成的期望。

一個例子:

sshpass -p<password> ssh <arguments>
sshpass -ptest1324 ssh user@192.168.1.200 ls -l /tmp

上面的命令可以很容易地與 Bash 腳本集成。

注意:請閱讀man sshpass安全注意事項部分以全面了解安全隱患。

在 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 腳本:

文件Remotelogin.exp

    #!/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 ,您可以使用passhhttps://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

參考:

  1. 在 SSH 連接中使用 Expect 腳本發送密碼命令不起作用
  2. 如何在 ssh 中禁用嚴格的主機密鑰檢查?
  3. 如何禁用 SSH 主機密鑰檢查
  4. scp 沒有 known_hosts 檢查
  5. 帶密碼認證的 pam_mount 和 sshfs

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM