gnu 병렬: 경고: 시간 초과로 인해 작업이 종료되었습니다.

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:

답변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

관련 정보