可以在不执行条件的情况下使用if

时间:2019-05-23 10:38:52

标签: bash

所以我试图做一个if语句来告诉我sftp连接是否成功或失败,以及是否成功,我想运行一段代码来自动执行ive已经完成的sftp下载。 我的问题是,此if语句执行此sftp连接,然后提示我输入密码并暂停其余代码。 我想做这样的事情

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

我想知道是否有可能使if语句不执行sftp连接,然后不提示我,也许在后台执行它。

如果有人可以告诉我即时询问的可能性,或者提出更好的解决方案,我将不胜感激,谢谢

1 个答案:

答案 0 :(得分:1)

您不能先不执行命令,然后再对已执行命令的返回值作出反应(因为这是您真正想要做的:检查是否可以成功运行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