Вы не можете не выполнить команду и затем отреагировать на возвращаемое значение выполненной команды (потому что это то, что вы действительно хотите сделать: проверьте, можете ли вы выполнить 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