Мне нужно получить информацию о том, была ли 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"на удаленном сервереи «SSH_NOK» на локальном хосте:
ssh -t -q $host 'echo '"$host"'SSH_OK; exec $SHELL' || echo "$host: SSH_NOK"
Но я бы придерживался предложения Джона установить подсказку, указывающую, на какой машине вы находитесь, и это на самом деле то, что вы предложили в своем вопросе. Вы можете пересмотреть, действительно ли вся эта дополнительная печать так уж полезна.
Вы также можете немного подробнее рассказать о том, чего именно вы пытаетесь добиться — возможно, есть лучший способ. Например, если вы запускаете скрипт, вывод которого анализируется и который может завершиться ошибкой, которая, однако, обнаруживается из его вывода, вы захотите добавить true
после выполнения скрипта (или в качестве последней команды, которая выполняется перед тем, как скрипт окончательно завершит работу) — это гарантирует, что ваш сеанс завершится успешно (т. е. с нулевым статусом выхода) и «echo SSH_NOK» не будет вызван.
решение2
То, что вы хотите, сделать нельзя. Если вы остаетесь на новом сервере, вы не выполняете часть команды для получения эха статуса, пока не выйдете с сервера. Так работает SSH. Если вы видите новое имя хоста в приглашении, то вы знаете, что все сработало, и вы на целевом сервере.
решение3
Вам необходимо обработать выходные данные из echo 2>&1
.
Пример
$ ssh -q skinner "echo 2>&1"
$
Вот что я бы сделал, используя один из моих хостов, skinner:
$ 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%/*}"