Получить указание команды 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"на удаленном сервереи «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

Если ваша цель — сначала убедиться, что вы можете подключиться к удаленному серверу, а затем выполнить кучу действий локально и удаленно, то я рекомендую

  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%/*}"

Связанный контент