私は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を使っているのは、どのユニットに接続するかを選択できるメニューを使っているからです。
ありがとう
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を待ってから(しばらくの間)対話セッションを返すまで待ちます。
最も簡単な方法はsshpassを使うことです。これはUbuntu/Debianレポジトリで利用可能であり、期待をbashと統合することを扱う必要はありません。
例:
sshpass -p<password> ssh <arguments>
sshpass -ptest1324 ssh [email protected] ls -l /tmp
上記のコマンドはbashスクリプトと簡単に統合できます。
注:セキュリティへの影響を完全に理解するためにman sshpass
のSecurity Considerationsを読んでください。
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に戻ります。
何ヶ月もの間その質問に対する答えを探した結果、私はついに本当に最良の解決策を見つけました:簡単なスクリプトを書くこと。
#!/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>
完了しました。
単純な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>
(pmtではなくhxtoolsから)ヘルパーツールfd0ssh
を使用すると、sshプログラムから特定のプロンプトを要求することなく動作します。
また使用することを確かめなさい
send -- "$PWD\r"
代わりに、ダッシュ( - )で始まるパスワードは失敗します。
上記は、ダッシュで始まる文字列をsendコマンドのオプションとして解釈しません。
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...
が原因で機能します。
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
参考文献: