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

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

pbcopy, pbpaste 

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

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

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

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


当前回答

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

其他回答

我最喜欢的方法是ssh [remote-machine] "cat log.txt" | xclip -selection c.当你不想(或不能)从远程ssh到本地时,这是最有用的。

编辑:在Cygwin ssh [remote-machine] "cat log.txt" > /dev/clipboard. txt

编辑:来自nbren12的有用评论:

几乎总是可以使用ssh端口转发建立反向ssh连接。只需将RemoteForward 127.0.0.1:2222 127.0.0.1:22添加到本地.ssh/config中的服务器条目中,然后在远程计算机上执行ssh -p 2222 127.0.0.1,然后将连接重定向到本地计算机。——nbren12

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

那个回答讨论了一般形式

<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-剪贴板可以在相同的框架并行构建。

不是一行程序,但不需要额外的ssh。

必要时安装netcat 使用termbin: cat ~/some_file.txt | nc termbin.com 9999。这将把输出复制到termbin网站,并将URL打印到输出中。 从您的计算机访问该url,您将获得输出

当然,不要将其用于敏感内容。

我重新启用这个帖子是因为我一直在寻找同样的解决方案,我已经找到了一个适合我的解决方案。这是对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

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