Linux

gnu 並行:警告:此作業已被終止,因為它超時

  • December 31, 2020

我在遠端主機上執行多個命令。如果我直接在我的 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:不清楚為什麼需要以sshpassroot 身份執行。
  • 不使用sshpass. 而是使用ssh-copy-id一次以使您的使用者能夠登錄。使用ssh-agent在您的 ssh 密鑰上仍然有一個密碼,但在登錄時不必輸入它。這樣,可以訪問備份的犯罪分子~/.ssh將無法使用您的密鑰。
  • 設置完成後,您應該能夠讓 GNU Parallel 直接使用--sshand進行登錄,--slf然後使用--onallor--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

引用自:https://unix.stackexchange.com/questions/626904