【问题标题】:Bash Script: What does this mean? "done < /dev/null & disown"Bash 脚本:这是什么意思? “完成 < /dev/null & 拒绝”
【发布时间】:2010-12-13 05:05:08
【问题描述】:

您能否准确解释一下最后一行的作用,以及为什么需要它?

while true; do
    /usr/bin/ssh -R 55555:localhost:22 -i ~/.ssh/tunnel-id user@server.com
    sleep 1
done < /dev/null & disown

这是整个脚本,它的目的是创建一个到中继服务器的 SSH 隧道。我是 Bash 新手,但它似乎会不断尝试保持连接处于活动状态,但我不明白最后一行的语法。

这个脚本是在防火墙后面使用 SSH 的过程的一部分,或者在我的例子中是 NAT: http://martin.piware.de/ssh/index.html

【问题讨论】:

    标签: bash syntax


    【解决方案1】:

    最后一行将/dev/null 作为输入重定向到循环中——它立即返回EOF——并在后台运行该进程。然后它在前台运行命令disown(1),分离进程,防止 HUP 信号停止它(有点像 nohup)。其效果是使循环变成类似于守护进程的东西。

    整个循环每秒运行一次 ssh 命令。该命令正在打开一个 ssh 隧道,将其本地连接到端口 5555 并远程连接到端口 22 (ssh)。如果有什么可以连接的,它会连接;否则重定向的 EOF 会导致它终止。然后它会在一秒钟后再次尝试。

    (或者我相信,我还没有真正尝试过。)

    在 bash 中,disown 是内置的;使用help disown查看一些详细信息。

    【讨论】:

    • 它怎么会输出“ssh: connect to host server.com port 22: Operation not allowed”,但是当我注释掉“sleep 1”行时,它似乎工作正常。
    • 对于任何阅读本文的人来说,这似乎是 Cygwin 的一个问题,因为这在我的 Linux 发行版中不会发生。
    【解决方案2】:

    /dev/null 重定向到while 循环有效地关闭了它的stdin,它应该等效于exec &lt;&amp;-。

    【讨论】:

    • 当我在 Cygwin 中运行它时,它输出“伪终端将不会被分配,因为标准输入不是终端。”我猜这很正常。
    • 谢谢。我遇到了一个更奇怪的错误。如果您想参考我对查理·马丁的回答发表的评论,我将不胜感激。
    猜你喜欢
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 2023-01-14
    • 2013-05-09
    相关资源
    最近更新 更多