私の目標は、CSVファイルのサーバーリストに対してログインが成功したことを確認することです。 SSHパスワード、ユーザーID、IPアドレスの場合は、CSVを介してその値を渡します。
SSHログインが成功するたびにSSH接続の出力をキャプチャしようとします。
これを行うためにシェルスクリプトを作成しましたが、CSVの最初のデータセットに対する正常なログイン出力のみが表示されます。残りのサーバーでは、SSH コマンドは失敗します。
スクリプト:
#!/bin/sh
INPUT=Test_data.csv
OLDIFS=$IFS
IFS=","
[ ! -f $INPUT ] && { echo "$INPUT file not found"; exit 99; }
while read ip user pass
do
sshpass -p $pass ssh -n -t -t -o "StrictHostKeyChecking no" $user@$ip >> output.txt
wait
exit
done < $INPUT
IFS=$OLDIFS
出力:
Welcome to CYBER SECURITY
Cisco Codec Release ce 9.12.3 140cd8212ba 2020-04-17
SW Release Date: 2020-04-17
*r Login successful
OK
^[[?1034h10.xx.xx.xx,admin,432584
Command not recognized.
10.xx.xx.xx,admin,432584
Command not recognized.
10.xx.xx.xx,admin,432584
Command not recognized.
10.xx.xx.xx,admin,432584
Command not recognized.
答え1
簡単に言うと:SSHシェルスクリプト確かに期待どおりに機能すると、スクリプトがクラッシュする可能性があります。
何が起こっているのかは明らかです。 「最初の」SSH接続が確立され、その時点からすべてがstdin
SSH接続に送信されます。 CiscoはCSV行の「コマンド」で何をすべきかわかりません。
ssh
マンページから:
SYNOPSIS
ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface] [-b bind_address] [-c cipher_spec] [-D [bind_address:]port]
[-E log_file] [-e escape_char] [-F configfile] [-I pkcs11] [-i identity_file] [-J destination] [-L address]
[-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port] [-Q query_option] [-R address]
[-S ctl_path] [-W host:port] [-w local_tun[:remote_tun]] destination [command]
これが[command]
重要です。リンクの反対側で何かを自動化するには、これを指定する必要があります。同じコマンドラインでssh
またはコマンドの一部ではありません。スクリプトでは絶対に呼び出されませんwait
。exit
行を次に変更してみてください。
sshpass -p $pass ssh -n -t -t -o "StrictHostKeyChecking no" $user@$ip 'wait; exit' >> output.txt
これが機能していることを確認してください。正直なところ、次のように設定することをお勧めします。アンシプール代わりに在庫を使用すると、多くの問題を解決できます。これは、実行してansible -m ping ciscos
素晴らしい要約を得ることができるからです。