SSH 명령에 대한 지침 보기

SSH 명령에 대한 지침 보기

ssh연결된 서버를 떠나지 않고 명령이 성공했는지 여부를 표시해야 합니다 .

나는 다음 명령을 사용합니다.

ssh -q  user1@server1 "echo 2>&1" && echo SSH_OK || echo SSH_NOK

이 명령의 문제점은 연결된 서버에 머물지 않는다는 것입니다. ssh명령 뒤에 테스트를 추가하고 싶지 않고 지금까지 수행한 작업을 명령을 통해 수행하고 싶습니다.

이제 작동 방식에 대한 예는 다음과 같습니다.

[nir@dhcppc4 ~]$ ssh -q  user1@server1 "echo 2>&1" && echo SSH_OK || echo SSH_NOK
SSH_NOK
[nir@dhcppc4 ~]$ hostname
dhcppc4
[nir@dhcppc4 ~]$ ssh -q  user1@server2 "echo 2>&1" && echo SSH_OK || echo SSH_NOK
SSH_OK
[nir@dhcppc4 ~]$ hostname
dhcppc4

내가 원하는 것의 예는 다음과 같습니다.

[nir@dhcppc4 ~]$ ssh -q  user1@server1 "echo 2>&1" && echo SSH_OK || echo SSH_NOK
SSH_NOK
[nir@dhcppc4 ~]$ hostname
dhcppc4
[nir@dhcppc4 ~]$ ssh -q  user1@server2 "echo 2>&1" && echo SSH_OK || echo SSH_NOK
SSH_OK
[nir@server2 ~]$ hostname
server2

답변1

"SSH_OK"를 출력해야 합니다.원격 서버에서그리고 localhost의 "SSH_NOK":

ssh -t -q $host 'echo '"$host"'SSH_OK; exec $SHELL' || echo "$host: SSH_NOK"

그러나 나는 현재 사용 중인 컴퓨터를 나타내는 프롬프트를 설정하라는 John의 제안을 고수할 것입니다. 이는 실제로 귀하의 질문에서 제안한 것입니다. 추가 인쇄가 실제로 그렇게 유용한지 다시 생각해 보고 싶을 수도 있습니다.

또한 정확히 달성하려는 것이 무엇인지 자세히 설명하고 싶을 수도 있습니다. 더 좋은 방법이 있을 수도 있습니다. 예를 들어, 출력이 구문 분석되고 오류로 끝날 수 있지만 출력에서 ​​감지할 수 있는 스크립트를 실행하는 경우 true스크립트 실행 후(또는 스크립트 이전에 실행되는 마지막 명령으로) 이를 추가해야 합니다. 세션이 성공적으로 종료되고(즉, 종료 상태가 0임) "echo SSH_NOK"가 호출되지 않는지 확인합니다.

답변2

당신이 원하는 것은 달성될 수 없습니다. 새 서버에 머무르는 경우 상태 에코를 가져오는 명령 부분은 서버를 종료하기 전에 실행되지 않습니다. 이것이 SSH가 작동하는 방식입니다. 프롬프트에 새 호스트 이름이 표시되면 해당 호스트 이름이 유효하고 대상 서버에 있다는 것을 알 수 있습니다.

답변3

당신은 그것을 처리해야합니다 echo 2>&1.

$ ssh -q skinner "echo 2>&1"

$

호스트 스키너 중 하나로 수행하는 작업은 다음과 같습니다.

$ ssh -q skinnerrr "echo 2>&1 > /dev/null"  && echo SSH_OK || echo SSH_NOK
SSH_NOK

$ ssh -q skinner "echo 2>&1 > /dev/null"  && echo SSH_OK || echo SSH_NOK
SSH_OK

답변4

귀하의 목표가 먼저 원격 서버에 연결할 수 있는지 확인한 다음 로컬 및 원격으로 여러 작업을 수행하는 것이라면 내 조언은 다음과 같습니다.

  1. 원격 연결을 설정합니다(닫는 대신).
  2. 당신의 일을 하세요.

원격 연결을 설정하려면 기본 세션을 실행하세요. 그런 다음 원격 작업을 수행하려면 기존 연결을 활용하세요. 슬레이브 연결은 기존 TCP 흐름을 사용하며 추가 인증이 필요하지 않으므로 네트워크나 원격 호스트가 다운되지 않는 한 성공하고 신속하게 연결됩니다.

ssh_control=$(mktemp -d)/ssh.control
ssh -M -o ControlMaster=yes -o ControlPath="$ssh_control" -n user1@server1
if [ $? -eq 0 ]; then
  do_some_local_stuff
  ssh -o ControlMaster=yes -o ControlPath="$ssh_control" -n user1@server1
  do_some_more_local_stuff
  if ! ssh -O check -o ControlMaster=yes -o ControlPath="$ssh_control" -n user1@server1; then
    echo 'Uh-oh! The SSH connection died abruptly.'
  fi
fi
ssh -O exit -o ControlMaster=yes -o ControlPath="$ssh_control" -n user1@server1
rm "$ssh_control"
rmdir "${ssh_control%/*}"

관련 정보