以下はスクリプトです。
複数のサーバーにログインしてカーネルのバージョンを確認したい。
#!/bin/bash
#input server names line by line in server.txt
cat server.txt | while read line
do
sshpass -p password ssh root@$line << EOF
hostname
uname -r
EOF
done
出力は次のようになると予想されます..
server1_hostname
kernel_version
server2_hostname
kernel_version
など..
私はserver.txtの約80台のサーバーでこのスクリプトを実行しました。
私が得た結果は次のとおりです...
Pseudo-terminal will not be allocated because stdin is not a terminal.
Pseudo-terminal will not be allocated because stdin is not a terminal.
Pseudo-terminal will not be allocated because stdin is not a terminal.
Pseudo-terminal will not be allocated because stdin is not a terminal.
Pseudo-terminal will not be allocated because stdin is not a terminal.
Pseudo-terminal will not be allocated because stdin is not a terminal.
Pseudo-terminal will not be allocated because stdin is not a terminal.
Pseudo-terminal will not be allocated because stdin is not a terminal.
Pseudo-terminal will not be allocated because stdin is not a terminal.
========================================================================
================================ WARNING ===============================
========================================================================
This system is solely for the use of authorized personnel. Individuals
using this system are subject to having some or all of their activities
monitored and recorded. Anyone using this system expressly consents to
such monitoring and is advised that any unauthorized or improper use of
this system may result in disciplinary action up to and including
termination of employment. Violators may also be subject to civil and/or
criminal penalties.
========================================================================
Warning: no access to tty (Bad file descriptor).
Thus no job control in this shell.
xxxxdev01
2.6.32-431.23.3.el6.x86_64
Pseudo-terminal will not be allocated because stdin is not a terminal.
Pseudo-terminal will not be allocated because stdin is not a terminal.
Pseudo-terminal will not be allocated because stdin is not a terminal.
Pseudo-terminal will not be allocated because stdin is not a terminal.
Pseudo-terminal will not be allocated because stdin is not a terminal.
ここではホスト1つの出力のみを取得し、xxxxdev01
SSHバナーやその他の警告も付属しています。
他のすべてのホストからの出力が必要で、SSHバナーは必要ありません。ここで何の問題がありますか?
答え1
hostname
そして、コマンドが期待どおりの出力を取得できない理由を説明することはできませんが、関係のないuname
テキストについては役に立ちます。
ssh
実行するコマンドがコマンドラインに提供されていないときにデフォルトでTTY割り当てを試みるため、「疑似ターミナル」行が印刷されます。 sshコマンドに「-T」を追加すると、このメッセージを防ぐことができます。
sshpass -p password ssh -T root@$line
「警告:ttyにアクセスできません」行はリモートシステムのシェルから来ます。場合によっては、メッセージを印刷しますcsh
。 TTYが必要な機能にアクセスしようとすると、リモートシステム上のファイルtcsh
または同様のファイル内のエントリによってトリガーされることがあります。.cshrc
答え2
次のコードを使用してください。
#!/bin/bash
#input server names line by line in server.txt
cat server.txt | while read line
do
sshpass -p password ssh root@$line 'hostname;uname -r'
done
答え3
ホストが以下を保存する場合server.txt
host1.tld
host2.tld
....
あなたはできます
mapfile -t myhosts < server.txt; for host in "${myhosts[@]}"; do ssh username@"$host" 'hostname;uname -r'; done
答え4
これは私にとって効果的です。
# cat hostsname.txt
operation01 172.20.68.37 5fDviDEwew
ngx-gw01 172.20.68.36 FiPp2UpRyu
gateway01 172.20.68.35 KeMbe57zzb
vehicle01 172.20.68.34 FElJ3ArM0m
# cat hostsname.txt | while read hostname ipaddr passwd; do sshpass -p $passwd /usr/bin/ssh-copy-id $ipaddr;done
間違いを避ける-t -t
より使用に注意を払いなさい-T
stdin が端末ではないため、疑似端末は割り当てられません。