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

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

pbcopy, pbpaste 

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

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

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

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


当前回答

有各种工具可以访问X11选择,包括xclip和XSel。注意,X11传统上有多个选择,大多数程序对剪贴板和主选择都有一定的理解(这是不一样的)。Emacs也可以使用二级选择,但这是罕见的,没有人真正知道如何处理剪切缓冲区…

$ xclip -help
Usage: xclip [OPTION] [FILE]...
Access an X server selection for reading or writing.

  -i, -in          read text into X selection from standard input or files
                   (default)
  -o, -out         prints the selection to standard out (generally for
                   piping to a file or program)
  -l, -loops       number of selection requests to wait for before exiting
  -d, -display     X display to connect to (eg localhost:0")
  -h, -help        usage information
      -selection   selection to access ("primary", "secondary", "clipboard" or "buffer-cut")
      -noutf8      don't treat text as utf-8, use old unicode
      -version     version information
      -silent      errors only, run in background (default)
      -quiet       run in foreground, show what's happening
      -verbose     running commentary

Report bugs to <astrand@lysator.liu.se>
$ xsel -help
Usage: xsel [options]
Manipulate the X selection.

By default the current selection is output and not modified if both
standard input and standard output are terminals (ttys).  Otherwise,
the current selection is output if standard output is not a terminal
(tty), and the selection is set from standard input if standard input
is not a terminal (tty). If any input or output options are given then
the program behaves only in the requested mode.

If both input and output is required then the previous selection is
output before being replaced by the contents of standard input.

Input options
  -a, --append          Append standard input to the selection
  -f, --follow          Append to selection as standard input grows
  -i, --input           Read standard input into the selection

Output options
  -o, --output          Write the selection to standard output

Action options
  -c, --clear           Clear the selection
  -d, --delete          Request that the selection be cleared and that
                        the application owning it delete its contents

Selection options
  -p, --primary         Operate on the PRIMARY selection (default)
  -s, --secondary       Operate on the SECONDARY selection
  -b, --clipboard       Operate on the CLIPBOARD selection

  -k, --keep            Do not modify the selections, but make the PRIMARY
                        and SECONDARY selections persist even after the
                        programs they were selected in exit.
  -x, --exchange        Exchange the PRIMARY and SECONDARY selections

X options
  --display displayname
                        Specify the connection to the X server
  -t ms, --selectionTimeout ms
                        Specify the timeout in milliseconds within which the
                        selection must be retrieved. A value of 0 (zero)
                        specifies no timeout (default)

Miscellaneous options
  -l, --logfile         Specify file to log errors to when detached.
  -n, --nodetach        Do not detach from the controlling terminal. Without
                        this option, xsel will fork to become a background
                        process in input, exchange and keep modes.

  -h, --help            Display this help and exit
  -v, --verbose         Print informative messages
  --version             Output version information and exit

Please report bugs to <conrad@vergenet.net>.

简而言之,您应该尝试xclip -i/xclip -o或xclip -i -sel clip/xclip -o -sel clip或xsel -i/xsel -o或xsel -i -b/xsel -o -b,这取决于您想要什么。

其他回答

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

那个回答讨论了一般形式

<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 [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

这是我基于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会话。这就是我的工作方式。享受。

有各种工具可以访问X11选择,包括xclip和XSel。注意,X11传统上有多个选择,大多数程序对剪贴板和主选择都有一定的理解(这是不一样的)。Emacs也可以使用二级选择,但这是罕见的,没有人真正知道如何处理剪切缓冲区…

$ xclip -help
Usage: xclip [OPTION] [FILE]...
Access an X server selection for reading or writing.

  -i, -in          read text into X selection from standard input or files
                   (default)
  -o, -out         prints the selection to standard out (generally for
                   piping to a file or program)
  -l, -loops       number of selection requests to wait for before exiting
  -d, -display     X display to connect to (eg localhost:0")
  -h, -help        usage information
      -selection   selection to access ("primary", "secondary", "clipboard" or "buffer-cut")
      -noutf8      don't treat text as utf-8, use old unicode
      -version     version information
      -silent      errors only, run in background (default)
      -quiet       run in foreground, show what's happening
      -verbose     running commentary

Report bugs to <astrand@lysator.liu.se>
$ xsel -help
Usage: xsel [options]
Manipulate the X selection.

By default the current selection is output and not modified if both
standard input and standard output are terminals (ttys).  Otherwise,
the current selection is output if standard output is not a terminal
(tty), and the selection is set from standard input if standard input
is not a terminal (tty). If any input or output options are given then
the program behaves only in the requested mode.

If both input and output is required then the previous selection is
output before being replaced by the contents of standard input.

Input options
  -a, --append          Append standard input to the selection
  -f, --follow          Append to selection as standard input grows
  -i, --input           Read standard input into the selection

Output options
  -o, --output          Write the selection to standard output

Action options
  -c, --clear           Clear the selection
  -d, --delete          Request that the selection be cleared and that
                        the application owning it delete its contents

Selection options
  -p, --primary         Operate on the PRIMARY selection (default)
  -s, --secondary       Operate on the SECONDARY selection
  -b, --clipboard       Operate on the CLIPBOARD selection

  -k, --keep            Do not modify the selections, but make the PRIMARY
                        and SECONDARY selections persist even after the
                        programs they were selected in exit.
  -x, --exchange        Exchange the PRIMARY and SECONDARY selections

X options
  --display displayname
                        Specify the connection to the X server
  -t ms, --selectionTimeout ms
                        Specify the timeout in milliseconds within which the
                        selection must be retrieved. A value of 0 (zero)
                        specifies no timeout (default)

Miscellaneous options
  -l, --logfile         Specify file to log errors to when detached.
  -n, --nodetach        Do not detach from the controlling terminal. Without
                        this option, xsel will fork to become a background
                        process in input, exchange and keep modes.

  -h, --help            Display this help and exit
  -v, --verbose         Print informative messages
  --version             Output version information and exit

Please report bugs to <conrad@vergenet.net>.

简而言之,您应该尝试xclip -i/xclip -o或xclip -i -sel clip/xclip -o -sel clip或xsel -i/xsel -o或xsel -i -b/xsel -o -b,这取决于您想要什么。

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

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

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