边界服务器故障问题,但我正在编程一些shell脚本,所以我先在这里尝试:)

大多数*nixes都有一个命令,可以让您将输出管道/重定向到本地剪贴板/粘贴板,并从中检索。在OS X上,这些命令是

pbcopy, pbpaste 

当SSHed到另一个服务器时,是否有办法复制此功能?也就是说,

我用的是电脑A。 我打开一个终端窗口 我SSH到计算机B 我在计算机B上运行一个命令 计算机B的输出被重定向或自动复制到计算机A的剪贴板。

是的,我知道我可以(战栗)用鼠标从命令中选择文本,但我已经习惯了直接将输出输出到剪贴板的工作流程,所以我希望远程会话也能这样。

代码很有用,但通用方法也很有用。


当前回答

这个答案在选择的答案基础上发展,增加了更多的安全性。

那个回答讨论了一般形式

<command that makes output> | \
    ssh <user A>@<host A> <command that maps stdin to clipboard>

可能缺乏安全性的地方是允许主机B>上<用户B> ssh到主机A并执行任何命令的ssh权限。

当然,从B到A的访问可能已经由ssh密钥进行了门控,它甚至可能有一个密码。但是另一个安全层可以限制B可以对A执行的允许命令的范围,例如,rm -rf /不能被调用。(当ssh密钥没有密码时,这一点尤其重要。)

幸运的是,ssh有一个称为命令限制或强制命令的内置功能。参见ssh.com,或者 这个serverfault.com问题。

下面的解决方案显示了一般的表单解决方案以及强制执行的ssh命令限制。

增加命令限制的解决方案

这个安全增强的解决方案遵循一般形式-从主机- b上的ssh会话调用简单:

cat <file> | ssh <user-A>@<host A> to_clipboard

剩下的部分显示了使其工作的设置。

ssh命令限制设置

假设B上的用户帐户是user-B, B有一个ssh密钥id-clip,它是以通常的方式创建的(ssh-keygen)。

然后在用户a的ssh目录中有一个文件

/home/user-A/.ssh/authorized_keys

识别密钥id-clip并允许SSH连接。

通常每行authorized_keys的内容就是被授权的公钥,例如id-clip.pub的内容。

但是,为了加强命令限制,公钥内容必须在要执行的命令前(在同一行)。 在我们的例子中:

command="/home/user-A/.ssh/allowed-commands.sh id-clip",no-agent-forwarding,no-port-forwarding,no-user-rc,no-x11-forwarding,no-pty <content of file id-clip.pub>

指定的命令“/home/user-A/.ssh/allowed-commands.sh id-clip”,并且只有指定的命令会在key id-clip被使用时执行到host-A的ssh连接-无论ssh命令行中写了什么命令。

该命令指示允许的脚本文件-commands.sh,该脚本文件的内容为

#/bin/bash
#
# You can have only one forced command in ~/.ssh/authorized_keys. Use this
# wrapper to allow several commands.

Id=${1}

case "$SSH_ORIGINAL_COMMAND" in
    "to-clipboard")
          notify-send "ssh to-clipboard, from ${Id}"
        cat | xsel --display :0 -i -b
          ;;
    *)
        echo "Access denied"
        exit 1
        ;;
esac

在机器B上对ssh的原始调用是

... | ssh <user-A>@<host A> to_clipboard

clipboard的字符串通过环境变量SSH_ORIGINAL_COMMAND传递给allowed-commands.sh。 另外,我们已经从authorized_keys中传递了密钥的名称id-clip,它只能被id-clip访问。

这条线

          notify-send "ssh to-clipboard, from ${Id}"

只是一个弹出的消息框,让你知道剪贴板正在写入-这可能是一个很好的安全功能。(通知发送在Ubuntu 18.04上有效,其他系统可能不行)。

在队列中

cat | xsel --display :0 -i -b

参数——display:0是必要的,因为进程没有自己的X显示和剪贴板, 所以必须明确指定。这个值:0恰好在Ubuntu 18.04和Wayland窗口服务器上工作。在其他设置中,它可能不起作用。对于标准的X服务器,这个答案可能会有所帮助。

host-A /etc/ssh/sshd_config参数

最后,在主机a的/etc/ssh/sshd_config中设置几个参数,以确保有连接权限,以及只使用ssh-key而没有密码的权限:

PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no
AllowUsers user-A

使sshd服务器重新读取配置

sudo systemctl restart sshd.service

or

sudo service sshd.service restart

结论

这是一些努力建立,但其他功能除了to-剪贴板可以在相同的框架并行构建。

其他回答

请允许我补充一个解决方案,如果我没记错的话,之前没有建议过。

它不需要客户端暴露在互联网上(没有反向连接),也不需要在服务器上使用任何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连接!

您可以在远程主机上使用xclip,同时在OSX系统上使用ssh X11转发和XQuartz。

设置方法:

安装XQuartz(我用solist + pivotal_workstation:: XQuartz recipe做了这个,但你不必这样做) 运行XQuartz.app 打开XQuartz首选项(+,) 确保选中“启用同步”和“当剪贴板发生变化时更新剪贴板” ssh -X remote-host "echo 'hello from remote-host' | xclip -select剪贴板"

如果你在Kubernetes集群中的pod上工作,而不是直接使用SSH,所以你没有办法进行文件传输,你可以使用cat,然后将终端输出保存为文本。例如,在macOS中,您可以执行Shell ->导出为文本。

@rhileighalmgren解决方案很好,但pbcopy会烦人地复制最后一个“\n”字符,我使用“head”剥离最后一个字符来防止这种情况:

#!/bin/bash
head -c -1 |  ssh desktop pbcopy

我的完整解决方案在这里:http://taylor.woodstitch.com/linux/copy-local-clipboard-remote-ssh-server/

远程管理器Linux端口支持在本地和远程主机之间同步剪贴板。您只需打开本地far2l,在里面执行“ssh somehost”,在ssh会话中运行远程far2l,并使用本地剪贴板获得远程far2l。

它支持Linux, *BSD和OS X;我做了一个特殊的putty构建来利用这个功能从窗口也。