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
먼저 원격 서버에 연결할 수 있는지 확인한 다음 로컬 및 원격으로 여러 가지 작업을 수행하는 것이 목표라면 다음을 권장합니다.
- 원격 연결을 설정하고 닫지 않습니다.
- 당신의 일을하십시오.
원격 연결을 설정하려면 마스터 세션을 실행하세요. 그런 다음 원격 작업을 수행하려면 기존 연결에 피기백하세요. 슬레이브 연결은 기존 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%/*}"