シェルスクリプトでは、SSH接続はCSVファイルの最初のデータ行に対してのみ機能し、残りのサーバーではコマンドが失敗します。

シェルスクリプトでは、SSH接続はCSVファイルの最初のデータ行に対してのみ機能し、残りのサーバーではコマンドが失敗します。

私の目標は、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接続が確立され、その時点からすべてがstdinSSH接続に送信されます。 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またはコマンドの一部ではありません。スクリプトでは絶対に呼び出されませんwaitexit

行を次に変更してみてください。

sshpass -p $pass ssh -n -t -t -o "StrictHostKeyChecking no" $user@$ip 'wait; exit' >> output.txt

これが機能していることを確認してください。正直なところ、次のように設定することをお勧めします。アンシプール代わりに在庫を使用すると、多くの問題を解決できます。これは、実行してansible -m ping ciscos素晴らしい要約を得ることができるからです。

関連情報