我想编写一个脚本,将本地计算机 ip(在 ssh 服务器网络上)作为参数,并将客户端计算机上的端口 5900 转发到服务器网络上的 ip:5900。
建立连接后,我想立即执行 vnc 查看器并使用转发的端口连接到该远程主机。
我提出的脚本如下:
#/bin/bash
ssh -L 5900:${1}:5900 user@server-ip
vncviewer 127.0.0.1:5900
它的使用方式如下:
假设服务器网络上有一台计算机,其 IP 为 10.0.0.10,因此执行以下命令:
vnc-ssh-script 10.0.0.10
在我的家庭(客户端)计算机上应该打开 vnc 查看器并允许我控制本地网络计算机 10.0.0.10(当然运行 vnc 服务器)。
唯一的问题是,在执行脚本的第一行(ssh -L 5900:${1}:5900 user@server-ip)后,连接就建立了,下一个命令(vncviewer 127.0.0.1:5900)要等到 ssh 会话关闭后才会执行……
我的问题是我该如何建立我想要的任务?
我已经尝试在 ssh 命令后附加“&”,但是当我执行脚本时,我收到消息:
“不会分配伪终端,因为 stdin 不是终端。”
并且似乎 ssh 已自动关闭(即使它确实有效,我也会在执行 vncviewer 命令之前得到它成功的指示)。
答案1
您必须将 SSH 连接保留在后台。命令末尾的 & 符号就是这个功能,我还传入了 N 标志,以停止在远程端运行的 shell(节省了一些资源,并阻止 SSH 对连接控制台产生不耐烦):
#/bin/bash
ssh -NL 5900:${1}:5900 user@${1} &
sleep 1
vncviewer 127.0.0.1:5900
我曾经做过类似的事情,但根据需要在远程计算机上运行 x11vnc。这还有一个副作用,那就是它只在 x11vnc 运行时启动……并且在第一次断开连接后退出(这是可取的!):
#/bin/bash
ssh -L 5900:${1}:5900 user@${1} "x11vnc" &
vncviewer 127.0.0.1:5900