Linux
gnu 並行:警告:此作業已被終止,因為它超時
我在遠端主機上執行多個命令。如果我直接在我的 ssh 腳本中傳遞我的命令,它就可以工作,一旦我從另一個腳本將它作為參數傳遞,它會給我一個我的第一個主機的結果,並在它登錄到它們後立即超時。如何從另一個腳本傳遞命令並使其正常工作,或者我的 ssh 腳本僅在一個主機上執行命令的原因是什麼?
#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:
您從範例中遺漏了一些內容:範例不完整,因為如果您沒有
--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
某些主機會失敗。如果它不適用於任何主機,我想您的報價已關閉。
我個人會:
- 刪除
sudo
:不清楚為什麼需要以sshpass
root 身份執行。- 不使用
sshpass
. 而是使用ssh-copy-id
一次以使您的使用者能夠登錄。使用ssh-agent
在您的 ssh 密鑰上仍然有一個密碼,但在登錄時不必輸入它。這樣,可以訪問備份的犯罪分子~/.ssh
將無法使用您的密鑰。- 設置完成後,您應該能夠讓 GNU Parallel 直接使用
--ssh
and進行登錄,--slf
然後使用--onall
or--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