我一直在为正在进行的项目实现一些反向 SSH 功能。为了从本地笔记本电脑直接通过 SSH 连接到远程设备,而无需先通过 SSH 连接到服务器(在本例中为 AWS 实例),我一直在使用以下命令:
ssh -nfN -R 0.0.0.0:4444:localhost:22 user@remote_ip
该命令正在执行我需要的操作,我只是不明白-f
、-N
、-n
命令到底在做什么。我阅读了手册页条目,但即便如此,我仍然不确定它们在做什么。
后台运行 SSH是-f
在远程设备上还是在服务器上?为什么是在“命令执行之前”?为什么必须将其包括在内?
当手册页条目-n
显示“从 /dev/null 重定向 stdin”时,它是什么意思 - 我知道 /dev/null 和 stdin 是什么,我只是不明白“重定向”部分具体是什么意思以及为什么有必要这样做。为什么“必须使用它在后台运行 SSH?”
为什么有-N
必要?
感谢你的帮助。我只是讨厌在不知道它们在做什么和为什么的情况下实施我在网上读到的东西。所以谢谢。
答案1
-f
或选项-n
使ssh
它们所针对的客户端处于后台,即在您的本地笔记本电脑上。(选项-f
暗示了-n
,因此您实际上只需要其中之一。)
后台运行后,您将获得一个新的 shell 提示符,允许您输入进一步的命令,即使命令ssh
继续运行以维护隧道。如果没有后台运行,您输入命令的终端窗口ssh
将在隧道运行时保持阻塞,您必须打开另一个终端窗口才能输入其他命令。
在后台运行的进程无法访问终端 ( /dev/tty
),因此其标准输入、输出和错误需要连接(重定向)到其他设备。在ssh
仅为创建隧道而运行的情况下,输入或输出都不是必需的,因此/dev/null
连接它们的自然设备也是必需的。
选项-N
告诉ssh
不要尝试从标准输入读取命令,因为连接到/dev/null
会返回 EOF 并从而立即终止隧道。
-f
如果ssh
需要为连接请求密码或口令,则选项是必需的,如果它已经在后台运行,则无法执行此操作。如果您的ssh
命令能够在没有您任何输入的情况下进行连接,-n
那就足够了,但-f
不会有什么坏处,所以无论是否真的需要,始终使用它都是可以的。