bash - 可以使用 if 而不执行其条件
问题描述
所以我试图做一个 if 语句来告诉我一个 sftp 连接是成功还是失败,如果它成功了,我想运行一段代码来自动执行我已经完成的 sftp 下载。我的问题是这个 if 语句执行这个 sftp 连接,然后提示我输入密码并停止其余代码。我想做这样的事情
if ( sftp -oPort=23 user@server )
then
expect <<-EOF
spawn sftp -oPort=23 user@server
.....
我想知道我是否可以让 if 语句不执行 sftp 连接然后不提示我,也许在后台执行它或其他什么。
如果有人能告诉我我的要求是否可行,或者为我想要做的事情提出更好的解决方案,我将不胜感激,谢谢
解决方案
您不能不执行命令,然后对执行命令的返回值做出反应(因为这是您真正想要做的:检查您是否可以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
推荐阅读
- database - 如何将外部联接与子查询和 groupby 一起使用?
- c# - 我如何通过反射从方法中获取路由(Url)
- javascript - Flask Stripe Checkout 动态价格 SessionID 错误
- swift - 如何适应 UI 警报视图上的所有选项
- c - 在 scanf 中使用 %c 并将值分配给 C 中的 int 变量?
- c# - 如何在多个柏林噪声块之间平滑?
- python - 正确处理 psycopg2 错误
- css - 有什么方法可以更改 mat-slide-toggle 的禁用状态颜色
- windows - 如何使用任务调度程序连续运行 .bat 文件?
- python - 无法构建 opencv-python