所以我试图做一个if语句来告诉我sftp连接是否成功或失败,以及是否成功,我想运行一段代码来自动执行ive已经完成的sftp下载。 我的问题是,此if语句执行此sftp连接,然后提示我输入密码并暂停其余代码。 我想做这样的事情
if ( sftp -oPort=23 user@server )
then
expect <<-EOF
spawn sftp -oPort=23 user@server
.....
我想知道是否有可能使if语句不执行sftp连接,然后不提示我,也许在后台执行它。
如果有人可以告诉我即时询问的可能性,或者提出更好的解决方案,我将不胜感激,谢谢
答案 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