можно использовать if, не выполняя его условие - PullRequest
1 голос
/ 23 мая 2019

поэтому я пытаюсь сделать оператор if, чтобы сказать мне, было ли соединение sftp успешным или неудачным, и если это успех, я хочу запустить фрагмент кода, который автоматизирует загрузку sftp, которую я уже сделал. Моя проблема заключается в том, что оператор if выполняет это соединение sftp, а затем запрашивает пароль и останавливает остальную часть кода. я хотел сделать что-то вроде этого

if ( sftp -oPort=23 user@server )
then
expect <<-EOF
spawn sftp -oPort=23 user@server
.....

Я хочу знать, возможно ли, чтобы оператор if не выполнял соединение sftp, а затем не запрашивал меня, может быть, выполнить его в фоновом режиме или что-то в этом роде.

Буду признателен, если кто-нибудь скажет мне, возможно ли то, что я спрашиваю, или предложит лучшее решение того, что я пытаюсь сделать, спасибо

1 Ответ

1 голос
/ 23 мая 2019

Вы не можете не выполнить команду и затем отреагировать на возвращаемое значение выполненной команды (потому что это то, что вы действительно хотите сделать: проверьте, можете ли вы выполнить sftp успешно, и если да, то сделать «правильно»запустить, но вы никогда не узнаете, может ли он успешно работать без запуска).

Итак, главный вопрос в том, что это то, что вы действительно хотите проверить.

Если вы хотите проверить, можете ли вы выполнить полное sftp соединение (со всеми рукопожатиями, а что нет), вы можете попробовать запустить sftp в пакетном режиме (который обычно неинтерактивен).

Например, следующее запускает сеанс sftp, только чтобы немедленно завершить его с помощью команды bye:

if echo bye | sftp -b - -oPort=23 user@server ; then 
  echo "sftp succeeded"
fi

Это будет успешным, только если работает весь сеанс sftp (то есть:Вы проходите любые проверки ключей, вы можете аутентифицироваться, ...).Если сервер запрашивает у вас пароль, он не сможет пройти аутентификацию (будучи неинтерактивным), и вы не введете тело then.

Если вы только хотите проверить, является ли чем-то прослушивает порт 23, для этого можно использовать netcat:

if netcat -z server 23; then
  echo "port:32 is open"
fi

Это будет выполнено всякий раз, когда он может успешно подключиться к порту 23 на сервере.Неважно, работает ли демон sftp или (что более вероятно) демон telnet.

Вы также можете провести минимальный тест, чтобы внешний сервер выглядел каксервер SSH / SFTP: ssh серверы обычно приветствуют вас строкой, указывающей, что они действительно говорят по ssh: что-то вроде «SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.4».С этой информацией вы можете запустить:

if echo QUIT | netcat server 23 | grep SSH; then
 echo "found an ssh server"
fi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...