web-dev-qa-db-ja.com

SSHコマンドにパスワードを提供するためにbashスクリプトでexpectを使用する

私はSSH鍵を使うべきだと答えたい人は棄権してください

SSHパスワードを提供するためにbashスクリプトでexpectを使用しようとしています。パスワードを入力してもうまくいきますが、SSHセッションに入るべきではありません。

私のスクリプト:

#!/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スクリプトに戻るときにだけ使用します。私が期待する前にbashを使っているのは、どのユニットに接続するかを選択できるメニューを使っているからです。

ありがとう

119
Max

Bashとexpectを混ぜるのは、望ましい効果を得るための良い方法ではありません。私だけを使用しようと思います:

#!/usr/bin/expect
eval spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com
#use 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を待ってから(しばらくの間)対話セッションを返すまで待ち​​ます。

75
Piotr Król

最も簡単な方法はsshpassを使うことです。これはUbuntu/Debianレポジトリで利用可能であり、期待をbashと統合することを扱う必要はありません。

例:

sshpass -p<password> ssh <arguments>
sshpass -ptest1324 ssh [email protected] ls -l /tmp

上記のコマンドはbashスクリプトと簡単に統合できます。

注:セキュリティへの影響を完全に理解するためにman sshpassSecurity Considerationsを読んでください。

51
dotnix

EODの直前に 'interactive' 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に戻ります。

18
dr-jan

何ヶ月もの間その質問に対する答えを探した結果、私はついに本当に最良の解決策を見つけました:簡単なスクリプトを書くこと。

#!/usr/bin/expect

set timeout 20

set cmd [lrange $argv 1 end]
set password [lindex $argv 0]

eval spawn $cmd
expect "assword:"
send "$password\r";
interact

それを/usr/bin/expに置くと、次のように使用できます。

  • exp <password> ssh <anything>
  • exp <password> scp <anysrc> <anydst>

完了しました。

13
damn_c

単純な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>
7
Vijay S B

(pmtではなくhxtoolsから)ヘルパーツールfd0sshを使用すると、sshプログラムから特定のプロンプトを要求することなく動作します。

6
user562374

また使用することを確かめなさい

send -- "$PWD\r" 

代わりに、ダッシュ( - )で始まるパスワードは失敗します。

上記は、ダッシュで始まる文字列をsendコマンドのオプションとして解釈しません。

6
Timmah

Bashスクリプトから小さい expectスクリプトを使用すると便利なもう1つの方法は、次のとおりです。

...
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...が原因で機能します。

4
Jimbo

Sublime Textビルドターゲットの内側、Makefileの内側で使用しようとすると、sshpassが壊れます。 sshpassの代わりにpasshを使用できます。 https://github.com/clarkwang/passh

sshpassを使用すると、次のようになります。

sshpass -p ssh user@Host

passhを使用すると、次のようになります。

passh -p ssh user@Host

注:-o StrictHostKeyChecking=noを使用することを忘れないでください。そうしないと、初めて使用したときに接続がハングします。例えば:

passh -p ssh -o StrictHostKeyChecking=no user@Host

参考文献:

  1. パスワードの送信コマンドはssh接続でexpectスクリプトを使用しても機能しません
  2. https://askubuntu.com/questions/87449/how-to-disable-strict-Host-key-checking-in-ssh
  3. https://linuxcommando.blogspot.com/2008/10/how-to-disable-ssh-Host-key-checking.html
  4. https://serverfault.com/questions/330503/scp-without-known-hosts-check
  5. https://debian-administration.org/article/587/pam_mount_and_sshfs_with_password_authentication
0
user