リモートホストで複数のコマンドを実行しています。 SSHスクリプトから直接コマンドを渡すと機能し、他のスクリプトからパラメータに渡すと最初のホストの結果が表示され、ログイン直後にタイムアウトします。他のスクリプトでコマンドを渡して動作させるにはどうすればよいですか?それとも私のsshスクリプトが1つのホストでのみコマンドを実行するのはなぜですか?
#Linux ssh
My_ssh_function () {
sudo sshpass -p "$1" ssh -q -o StrictHostKeyChecking=no root@"$2" "$command_linux"
}
export -f My_ssh_function
export -p command_linux
export -p file_with_targets_linux
export -p passwords
parallel -j 2 --tag My_ssh_function :::: "$passwords" "$file_with_targets_linux"
他のファイルから渡されたコマンド:(他のスクリプトから上記のスクリプトに送信しない限り、うまくいきます。)
""/sbin/dmidecode | /usr/bin/grep "Product Name:" | /usr/bin/awk '{print $4, $5}' > /tmp/result && free -h --si |grep Mem | awk '{print $2}' >> /tmp/result && dmidecode -s system-serial-number >> /tmp/result && hostname |awk -F"." '{print $1}' >> /tmp/result && cat /tmp/result |xargs""
parallel: Warning: My_ssh_function host_password_string 135.121.157.80 parallel: Warning: This job was killed because it timed out:
答え1
例では何かが抜けました。がないため、例は完全ではありません--timeout
。
つまり、My_ssh_function
期待どおりに機能していることをテストする必要があります。
だからこれを試してみてください:
# remove --tag from parallel
parallel --dryrun ... > myfile.sh
# Does myfile.sh contain what you expect now?
cat myfile.sh
# Does it run as you expect?
bash myfile.sh
一部のホストで動作している場合は、sshpass ... ssh
一部のホストで失敗すると思います。
どのホストでも動作しない場合は、見積もりが間違っているようです。
個人的に私:
- 削除済み:rootとして実行する
sudo
理由は不明です。sshpass
- 使用しないでください
sshpass
。代わりにssh-copy-id
ユーザーを一度だけログインしてください。 SSHキーにはまだパスワードがありますが、ssh-agent
ログイン時にパスワードを入力する必要はありません。これにより、バックアップにアクセスする犯罪者が~/.ssh
あなたの鍵を使用できなくなります。 - 一度設定すると、GNU Parallelを直接使用でき
--ssh
、ログイン--slf
してコマンドを使用--onall
または--nonall
実行できます。 - この方法が動作している間、長い一行スクリプトをbash関数に変換してからリモート
env_parallel
システムにコピーすることを検討することができます。
このような:
at_startup() {
# Add sshkey to sshagent unless already done
if [ -e ~/.ssh/SSH_AUTH_SOCK ] ; then
export SSH_AUTH_SOCK=`cat ~/.ssh/SSH_AUTH_SOCK`
fi
if [ -e ~/.ssh/SSH_AGENT_PID ] ; then
export SSH_AGENT_PID=`cat ~/.ssh/SSH_AGENT_PID`
fi
if ssh-add -l ; then
true
else
eval `ssh-agent` ssh-add ~/.ssh/id*[^b] &&
echo $SSH_AUTH_SOCK > ~/.ssh/SSH_AUTH_SOCK &&
echo $SSH_AGENT_PID > ~/.ssh/SSH_AGENT_PID
fi
}
setup_ssh_keys_once() {
setupone() {
sshpass -p "$1" ssh-copy-id -o StrictHostKeyChecking=no root@"$2"
}
export -f setupone
parallel setupone :::: "$passwords" "$file_with_targets_linux"
}
env_parallel --session
command_linux() {
/sbin/dmidecode | /usr/bin/grep "Product Name:" | /usr/bin/awk '{print $4, $5}' > /tmp/result &&
free -h --si |grep Mem | awk '{print $2}' >> /tmp/result &&
dmidecode -s system-serial-number >> /tmp/result &&
hostname | awk -F"." '{print $1}' >> /tmp/result &&
cat /tmp/result |xargs
}
# Yes: env_parallel can copy a function to a remote server - even if it is not exported
env_parallel --ssh 'ssh -l root' --slf "$file_with_targets_linux" --nonall command_linux