【问题标题】:it is possible to use an if without executing its condition可以使用 if 而不执行其条件
【发布时间】:2019-10-09 22:06:59
【问题描述】:

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

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

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

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

【问题讨论】:

  • 连接后不要尝试重新连接。无论如何,取决于你接下来打算做什么。您可能会尝试通过连接发送命令,但它不会起作用,因为此时 sftp 将期待来自标准输入的输入。
  • 编辑后,只需删除if,除非您在连接并发送命令后需要执行其他操作。无论如何它都会出错。
  • 这就是我的问题,如果我的实际 stfp 连接命令,导致它在一个heredoc 和它的内部期望,我需要做自动化部分
  • 是的,连接后我需要下载一些文件
  • except 有条件。看看this 问题和相关答案。它可能会给你一些关于如何进行的想法。

标签: bash


【解决方案1】:

你不能不执行命令然后对执行命令的返回值做出反应(因为这是你真正想要做的:检查你是否可以运行sftp成功,如果可以,做一个“正确”运行;但你永远不知道它是否可以成功运行而不运行它)。

所以主要问题是,什么这是你真正想要测试的。

如果您想测试是否可以进行完整的sftp 连接(包括所有握手等等),您可以尝试在批处理模式下运行sftp(方便非交互式)。

例如以下运行sftp 会话,只是用bye 命令立即终止它:

if echo bye | sftp -b - -oPort=23 user@server ; then 
  echo "sftp succeeded"
fi

只有在整个sftp 会话正常工作时才会成功(即:您通过了任何密钥检查;您可以进行身份​​验证,...)。 如果服务器要求您输入密码,它将无法进行身份验证(非交互式),并且您将无法输入 then 正文。

如果您只想检查 something 是否在端口 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

【讨论】:

  • 我的目标是,连接到一堆应该可以通过 ssh 连接的服务器,但总有一些服务器会遇到某种类型的错误,这使得无法通过以下方式连接到它们SSH。我想制作一个脚本来连接所有这些服务器并将一行打印到文件中,例如“无法连接到....”,我现在想出了一个很好的解决方法,所以我不再需要帮助,但你的答案似乎有用,谢谢
猜你喜欢
  • 1970-01-01
  • 2017-11-12
  • 2013-06-16
  • 1970-01-01
  • 2011-05-19
  • 2017-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多