首页 > 解决方案 > 可以使用 if 而不执行其条件

问题描述

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

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

我想知道我是否可以让 if 语句不执行 sftp 连接然后不提示我,也许在后台执行它或其他什么。

如果有人能告诉我我的要求是否可行,或者为我想要做的事情提出更好的解决方案,我将不胜感激,谢谢

标签: bash

解决方案


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

推荐阅读