원격 호스트에서 여러 명령을 실행하고 있습니다. 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:
답변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
일부 호스트에서는 실패할 것이라고 생각합니다.
어떤 호스트에서도 작동하지 않으면 귀하의 견적이 잘못된 것 같습니다.
개인적으로 나는:
- 제거됨 : 루트로 실행
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