边界服务器故障问题,但我正在编程一些shell脚本,所以我先在这里尝试:)
大多数*nixes都有一个命令,可以让您将输出管道/重定向到本地剪贴板/粘贴板,并从中检索。在OS X上,这些命令是
pbcopy, pbpaste
当SSHed到另一个服务器时,是否有办法复制此功能?也就是说,
我用的是电脑A。
我打开一个终端窗口
我SSH到计算机B
我在计算机B上运行一个命令
计算机B的输出被重定向或自动复制到计算机A的剪贴板。
是的,我知道我可以(战栗)用鼠标从命令中选择文本,但我已经习惯了直接将输出输出到剪贴板的工作流程,所以我希望远程会话也能这样。
代码很有用,但通用方法也很有用。
我重新启用这个帖子是因为我一直在寻找同样的解决方案,我已经找到了一个适合我的解决方案。这是对OSX日报建议的一个小修改。
在我的例子中,我使用本地OSX机器上的Terminal通过SSH连接到linux服务器。像OP一样,我希望能够仅使用键盘将小块文本从终端传输到本地剪贴板。
解决方案的精髓:
commandThatMakesOutput | ssh desktop pbcopy
当在远程计算机的ssh会话中运行时,该命令接受commandThatMakesOutput的输出(例如ls, pwd),并将输出管道输出到本地计算机的剪贴板(“desktop”的名称或IP)。换句话说,它使用嵌套ssh:您通过一个ssh会话连接到远程计算机,在那里执行命令,远程计算机通过另一个ssh会话连接到您的桌面,并将文本放入剪贴板。
它要求将您的桌面配置为ssh服务器(我把它留给您和谷歌)。如果您已经设置了ssh密钥以方便快速使用ssh,那么就会容易得多,最好使用每个会话的密码短语,或任何您的安全需求。
其他的例子:
ls | ssh desktopIpAddress pbcopy
pwd | ssh desktopIpAddress pbcopy
为了方便起见,我创建了一个bash文件来缩短管道后所需的文本:
#!/bin/bash
ssh desktop pbcopy
在我的情况下,我使用一个特殊命名的密钥
我用文件名cb(我的助记符(剪贴板)保存它。把脚本放在你路径的某个地方,让它可执行,瞧:
ls | cb
ssh服务器反向隧道端口
所有现有的解决方案要么需要:
客户端上的X11(如果有的话,服务器上的xclip效果很好)或
客户端和服务器在同一个网络中(如果你在工作时试图访问你的家用电脑,情况就不同了)。
这里有另一种方法,不过您需要修改ssh登录计算机的方式。
我已经开始使用这个,它远没有看起来那么吓人,所以试一试。
客户端(ssh会话启动)
ssh username@server.com -R 2000:localhost:2000
(提示:使此为键绑定,这样您就不必键入它)
客户端(另一个选项卡)
nc -l 2000 | pbcopy
注意:如果你没有pbcopy,那么就把它tee到一个文件。
服务器(SSH会话内部)
cat some_useful_content.txt | nc localhost 2000
其他的笔记
实际上,即使您在ssh会话中间,也有一种方法可以启动隧道,但我不想把人们吓跑,因为实际上并没有看起来那么糟糕。但如果有人感兴趣的话,我会稍后再补充细节
请允许我补充一个解决方案,如果我没记错的话,之前没有建议过。
它不需要客户端暴露在互联网上(没有反向连接),也不需要在服务器上使用任何xlib,并且完全使用ssh自己的功能来实现(没有第三方的箱子)。
它包括:
打开一个到远程主机的连接,然后在它上面创建一个fifo文件,并并行地等待这个fifo(所有事情都是相同的实际TCP连接)。
回显到fifo文件的任何内容都将在本地剪贴板中结束。
当会话完成时,删除服务器上的fifo文件并一起干净地终止连接。
该解决方案利用ssh的ControlMaster功能,只使用一个TCP连接的一切,因此它甚至将支持需要密码登录的主机,并提示您一次。
编辑:按照要求,代码本身:
将以下内容粘贴到bashrc并使用sshx主机进行连接。
在远程机器上返回SOMETHING > ~/clip,希望SOMETHING最终会出现在本地主机的剪贴板中。
您需要在本地主机上使用xclip实用程序。
_dt_term_socket_ssh() {
ssh -oControlPath=$1 -O exit DUMMY_HOST
}
function sshx {
local t=$(mktemp -u --tmpdir ssh.sock.XXXXXXXXXX)
local f="~/clip"
ssh -f -oControlMaster=yes -oControlPath=$t $@ tail\ -f\ /dev/null || return 1
ssh -S$t DUMMY_HOST "bash -c 'if ! [ -p $f ]; then mkfifo $f; fi'" \
|| { _dt_term_socket_ssh $t; return 1; }
(
set -e
set -o pipefail
while [ 1 ]; do
ssh -S$t -tt DUMMY_HOST "cat $f" 2>/dev/null | xclip -selection clipboard
done &
)
ssh -S$t DUMMY_HOST \
|| { _dt_term_socket_ssh $t; return 1; }
ssh -S$t DUMMY_HOST "rm $f"
_dt_term_socket_ssh $t
}
更详细的解释在我的网站上:
https://xicod.com/2021/02/09/clipboard-over-ssh.html
这是我基于SSH反向隧道、netcat和xclip的解决方案。
首先创建脚本(例如:Clipboard-daemon.sh)
#!/bin/bash
HOST=127.0.0.1
PORT=3333
NUM=`netstat -tlpn 2>/dev/null | grep -c " ${HOST}:${PORT} "`
if [ $NUM -gt 0 ]; then
exit
fi
while [ true ]; do
nc -l ${HOST} ${PORT} | xclip -selection clipboard
done
然后在后台启动。
./clipboard-daemon.sh&
在接收到部分数据后,将开始数控管道输出到xclip和重生过程
然后启动ssh连接到远程主机:
ssh user@host -R127.0.0.1:3333:127.0.0.1:3333
当登录在远程框上时,尝试这样做:
echo "this is test" >/dev/tcp/127.0.0.1/3333
然后在您的工作站上尝试粘贴
当然,您可以编写包装器脚本,首先启动clipboard-daemon.sh,然后启动ssh会话。这就是我的工作方式。享受。