リモートSSHセッションからローカルクリップボードにデータを送信する方法


161

Borderline ServerFaultの質問ですが、いくつかのシェルスクリプトをプログラミングしているので、ここで最初に試します:)

ほとんどの* nixには、出力をローカルのクリップボード/ペーストボードにパイプ/リダイレクトし、そこから取得できるコマンドがあります。OS Xでは、これらのコマンドは

pbcopy, pbpaste 

とにかく、別のサーバーにSSH接続している間にこの機能を複製することはできますか?あれは、

  1. コンピューターAを使用しています。
  2. ターミナルウィンドウを開く
  3. コンピュータBにSSH接続します
  4. コンピューターBでコマンドを実行します
  5. コンピューターBの出力はリダイレクトされるか、コンピューターAのクリップボードに自動的にコピーされます。

そして、はい、マウスを使用して(シャダー)コマンドからテキストを選択できることはわかっていますが、リモートセッションでも同じように出力をクリップボードに直接出力するワークフローに慣れてきました。

コードは便利ですが、一般的なアプローチも評価されます。

回答:


89

私は同じ種類の解決策を探していたのでこのスレッドを復活させており、私に役立つ解決策を見つけました。OSX Dailyからの提案に対するマイナーな変更です。

私の場合、ローカルOSXマシンのターミナルを使用して、SSH経由でLinuxサーバーに接続します。OPと同様に、キーボードのみを使用して、端末からローカルクリップボードに小さなテキストを転送できるようにしたいと考えました。

ソリューションの本質:

commandThatMakesOutput | ssh desktop pbcopy

このコマンドは、リモートコンピューターへのsshセッションで実行されると、commandThatMakesOutputの出力(ls、pwdなど)を受け取り、ローカルコンピューターのクリップボード(「デスクトップ」の名前またはIP)にパイプで出力します。つまり、ネストされたsshを使用します。1つのsshセッションを介してリモートコンピューターに接続し、そこでコマンドを実行すると、リモートコンピューターは別のsshセッションを介してデスクトップに接続し、テキストをクリップボードに書き込みます。

デスクトップをsshサーバーとして構成する必要があります(私はあなたとgoogleに任せます)。ssh鍵を設定してsshを高速に使用できるようにすると、セッションごとのパスフレーズを使用したり、セキュリティに必要なものを使用したりする方がはるかに簡単です。

その他の例:

ls  | ssh desktopIpAddress pbcopy
pwd |  ssh desktopIpAddress pbcopy

便宜上、パイプの後に必要なテキストを短くするためにbashファイルを作成しました。

#!/bin/bash
ssh desktop pbcopy

私の場合、特別な名前のキーを使用しています

ファイル名cb(ニーモニック(ClipBoard))で保存しました。パスのどこかにスクリプトを置いて、実行可能にしてください。

ls | cb

3
私はしばしばこれをvimで行います。これを行うには、あなたはビジュアルモードでコピーしたいものを選択するには、次のように入力します。:'<,'>w !ssh desktop pbcopy
マイク・ブレナン

@MikeBrennanテキストを選択したら、cmd + C(または設定したコピーキー)を押してみませんか?...
Petr Peller、2013年

36
このように、実際に機能するのは、デスクトップに静的IPがあり、sshを実行したボックスからアクセスできる場合のみです。それは私には決して当てはまりません。
kqw 2014

6
逆の方が簡単ではないでしょうか?ssh user @ remote 'commandThatMakesOutput' | pbcopy
rulio

私は、必要に応じて-e none:SSHフラグは、ここで説明unix.stackexchange.com/questions/210615/...
パットマイロン

122

私の好きな方法はssh [remote-machine] "cat log.txt" | xclip -selection cです。これは、リモートからローカルにsshしたくない(またはできない)場合に最も役立ちます。

編集:Cygwinでssh [remote-machine] "cat log.txt" > /dev/clipboard

編集:nbren12からの役立つコメント:

ほとんどの場合、SSHポート転送を使用してリバースSSH接続をセットアップすることが可能です。RemoteForward 127.0.0.1:2222 127.0.0.1:22ローカルのサーバーのエントリに追加し、リモートマシンで.ssh/config実行するだけssh -p 2222 127.0.0.1で、接続がローカルマシンにリダイレクトされます。– nbren12


6
+1:リバースSSH接続が不可能な場合、他のソリューションよりもはるかに簡単です。
John Dibling 2014年

9
あなたはその非常にシンプルなソリューションにもっといいね!
Kamil Dziedzic 2014

31
マックOSX、上たちのもののためにssh [remote-machine] "cat log.txt" | pbcopy
chowey

1
この報告書のとおり、ここで、私が使用していたcatWindows 8のcygwinの上の仕事にこれを取得する:ssh [remote-machine] "cat log.txt" | cat > /dev/clipboard(もちろん、私のリモートコマンドではありませんでしたcat。私は実際に走ったので、それは浮浪者の仮想マシン内で何か他のものだったvagrant ssh -c "command" | cat > /dev/clipboard
ティビ

7
それはほとんどのセットアップに常にSSHポートフォワーディングを使用して、逆のssh接続可能。RemoteForward 127.0.0.1:2222 127.0.0.1:22ローカルのサーバーエントリに追加し、リモートマシンで.ssh/config実行するだけssh -p 2222 127.0.0.1で、接続がローカルマシンにリダイレクトされます。
nbren12 2016

30

リバースSSH接続を必要としない優れたソリューションを見つけました!

リモートホストでxclipを使用し、OSXシステムでssh X11転送とXQuartzを使用できます。

これを設定するには:

  1. XQuartzをインストールします(これはsoloist + pivotal_workstation :: xquartzレシピで行いましたが、必ずしもそうする必要はありません)。
  2. XQuartz.appを実行します
  3. XQuartz設定を開く(kb_command+ ,
  4. 確認してください「の同期を有効にする」「クリップボードが変化したときに更新ペーストボード」がチェックされています XQuartz設定ウィンドウの例
  5. ssh -X remote-host "echo 'hello from remote-host' | xclip -selection clipboard"

1
これはどう違うのssh remote-host "echo 'hello from remote-host' | pbcopyですか?これは、次のように機能する場合に優れた答えになり ssh -X remote-hostます。リモートホスト上で:echo 'hello from remote-host' | xclip -selection clipboard
kqw

5
@KasperSouren。私はそれがあなたが望む方法でうまくいくと信じています。`| xclip`は二重引用符の内側にあります。
gdw2

1
2016年には、これが明らかに最高の飾り気のないソリューションです。他のリバースSSHベースのソリューションを忘れてください。
shivams 2016年

1
これを1回限りのコマンドなしで実行する方法はありますか?sshを介したインタラクティブセッションでリモートサーバーにログインし、任意のローカルクリップボードに送信できるようにしたいと考えています。それには逆SSHが必要ですか?
クワス2017年

2
@Kvass:-XSSHを介したX11転送に使用している限り、X11プログラムは上記のXQuartz設定を介してクリップボードを更新できます。1回限りのコマンドはecho、リモートホストのクリップボードにvia を送信することxclipは機能し、ローカルのSSHクライアントホストと同期する必要があることを示すためのものです。@ gdw2が言うように、「The | xclipis the double quotes」です。そのため、リモートサーバーでコマンドとして実行され、クリップボードに何かを送信します。
TrinitronX 2017年

18

SSHサーバーの逆トンネルポート

既存のすべてのソリューションには次のものが必要です。

  • クライアント上のX11(使用している場合xclipは、サーバー上で正常に動作します)または
  • クライアントとサーバーが同じネットワーク上にあること(自宅のコンピューターにアクセスしようとしている場合はそうではありません)。

これを行う別の方法がありますが、コンピュータへのSSH接続方法を変更する必要があります。

私はこれを使い始めましたが、見た目ほど威圧的ではないので、試してみてください。

クライアント(sshセッションの起動)

ssh username@server.com -R 2000:localhost:2000

(ヒント:これをキーバインドにするので、入力する必要はありません)

クライアント(別のタブ)

nc -l 2000 | pbcopy

注:持っていない場合はpbcopyteeそれをファイルに追加してください。

サーバー(SSHセッション内)

cat some_useful_content.txt | nc localhost 2000

その他の注意事項

sshセッションの途中であっても、トンネルを開始する方法はありますが、見た目ほど悪くないものから人々を怖がらせたくありません。でも興味があれば後で詳細を追加します


1
+1-それはかなりきちんとしています。ただし、cat some_useful_content.txt | nc localhost 2000これを実行するとコマンドがハングするようです。手動でctr-cを停止して停止する必要があります。コンテンツがクライアントのクリップ/ペーストボードに到達するのは、そのときだけです
Alan Storm

1
誰かがもう一方の端でデータをデキューするまで待機します。
Sridhar Sarnobat

実は私はあなたの質問を誤解したと思います。それがなぜ起こるか私にはわかりません。
Sridhar Sarnobat

nc -l -p私にとってnc -lはうまくいきますが、うまくいきません。また、@ AlanStormの問題もあります。
HappyFace 2018

1
を指定することにより、netcatがハングする問題を解決しました-c。私はbrewによってインストールされたGNU netcatを使用しています。
HappyFace 2018

7

xclipXSelなど、X11の選択にアクセスするためのさまざまなツールがあります。X11には伝統的に複数の選択があり、ほとんどのプログラムはクリップボードとプライマリ選択(同じではない)の両方をある程度理解していることに注意してください。Emacsも二次選択を処理できますが、それはまれであり、カットバッファーをどう処理するか誰も知りません...

$ xclip -help
使用法:xclip [オプション] [ファイル] ...
読み取りまたは書き込みのためにXサーバー選択にアクセスします。

  -i、-in標準入力またはファイルからテキストをX選択に読み込みます
                   (デフォルト)
  -o、-outは、選択範囲を標準出力に出力します(通常、
                   ファイルまたはプログラムへのパイプ)
  -l、-loops終了する前に待機する選択要求の数
  -d、-display接続するXディスプレイ(例:localhost:0 ")
  -h、-help使用法に関する情報
      アクセスする選択範囲の選択( "primary"、 "secondary"、 "clipboard"または "buffer-cut")
      -noutf8テキストをutf-8として扱わず、古いユニコードを使用します
      -versionバージョン情報
      -サイレントエラーのみ、バックグラウンドで実行(デフォルト)
      -フォアグラウンドで静かに実行し、何が起こっているかを示します
      -詳細な実行中の解説

バグを<astrand@lysator.liu.se>に報告してください
$ xsel -help
使用法:xsel [オプション]
X選択を操作します。

デフォルトでは、現在の選択が出力され、両方の場合は変更されません
標準入力と標準出力は端末(tty)です。さもないと、
標準出力が端末でない場合、現在の選択が出力されます
(tty)、標準入力の場合、標準入力から選択が設定されます
端末(tty)ではありません。入力または出力オプションが指定されている場合
プログラムは要求されたモードでのみ動作します。

入力と出力の両方が必要な場合、以前の選択は
標準入力の内容で置き換えられる前に出力します。

入力オプション
  -a、--append標準入力を選択に追加します
  -f、--follow標準入力の増加に応じて選択に追加
  -i、--input選択に標準入力を読み込みます

出力オプション
  -o、--output選択範囲を標準出力に書き込みます

アクションオプション
  -c、--clear選択をクリアします
  -d、--delete選択を解除し、
                        それを所有するアプリケーションは、その内容を削除します

選択オプション
  -p、--primary PRIMARY選択を操作します(デフォルト)
  -s、--secondary SECONDARYセレクションを操作します
  -b、-clipboard CLIPBOARD選択で操作

  -k、-keep選択を変更せず、PRIMARYを作成します
                        およびSECONDARYの選択は、
                        彼らは出口で選択されたプログラム。
  -x、--exchange PRIMARYとSECONDARYの選択を交換します

Xオプション
  --display displayname
                        Xサーバーへの接続を指定する
  -t ms、-selectionTimeout ms
                        タイムアウトをミリ秒単位で指定します。
                        選択を取得する必要があります。値0(ゼロ)
                        タイムアウトなしを指定します(デフォルト)

その他のオプション
  -l、--logfile切り離されたときにエラーを記録するファイルを指定します。
  -n、--nodetach制御端末から切り離しません。なし
                        このオプション、xselはフォークして背景になります
                        入力、交換、保持モードで処理します。

  -h、--helpこのヘルプを表示して終了します
  -v、--verbose情報メッセージを出力します
  --versionバージョン情報を出力して終了

バグは<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ます。


4
@ephemientの投稿に追加するには:リモートホストでxclip&xselを使用するには、次のようにX11転送を使用できますssh -C -X user@remote-host。リモート側でxclipを実行しても機能しない場合X11Forwarding yesは、リモート/etc/ssh/sshd_configファイルでが設定されていることを確認してください。またxauth、がリモート側にインストールされていることを確認してください。ヘッドレスマシンの場合、xauthおよびをインストールできますxvfb
TrinitronX、

ここだ説明余分な詳細プラスvimのキーバインディングとは。
Tim Bunce、2012年

1
@TrinitronXあらすごい-頭を壁にぶつけて、xvfb言及してくれてありがとう。私はヘッドレスサーバーを実行していたので、X11は実行されていなかったはずです。
Cam

5

これは、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へのncパイピング出力と再生成プロセスを開始します

次に、リモートホストへの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セッションを開始するラッパースクリプトを記述することもできます。これは私にとってそれがどのように機能するかです。楽しい。


このソリューションは、私にとって最も効果的なソリューションです。複雑すぎず、適切に機能します。
Marcel Valdez Orozco

私の意見では最良の解決策です。セキュリティに影響するリバースSSH接続を許可することを心配する必要はありません。無限ループは便利です。
R.タウクリス

4

ワンライナーではありませんが、追加のsshは必要ありません

  • netcat必要に応じてインストール
  • termbinを使用しますcat ~/some_file.txt | nc termbin.com 9999。これにより、出力がtermbinWebサイトにコピーされ、URLが出力に印刷されます。
  • コンピューターからそのURLにアクセスすると、出力が得られます

もちろん、デリケートなコンテンツには使用しないでください。


うわーそれは非常に創造的なソリューションです。
Sridhar Sarnobat

3

この回答は、セキュリティを強化することにより、選択した回答の両方に基づいて開発されています。

その答えは一般的な形を議論しました

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

セキュリティが不足することができるどこにあるssh可能なアクセス許可<user B>host B>するsshhost Aして実行する任意のコマンドを実行。

もちろんBAアクセスはすでにsshキーによってゲートされている場合があり、パスワードが設定されている場合もあります。ただし、別のセキュリティ層により、でB実行できるコマンドの範囲が制限される場合があります。Aたとえば、このコマンドをrm -rf /呼び出すことができません。(これは、sshキーにパスワードがない場合に特に重要です。)

幸い、にsshコマンド制限または強制コマンドと呼ばれる機能が組み込まれています。ssh.comまたはこのserverfault.comの質問を参照してください。

以下のソリューションは、一般的なフォームソリューションと、強制されたssh コマンド制限を示しています。

コマンド制限が追加されたソリューションの例

このセキュリティ強化されたソリューションは一般的な形式に従います- sshセッションからの呼び出しは次のとおりhost-Bです:

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

これ以降は、それを機能させるための設定を示します。

sshコマンド制限の設定

上のユーザーアカウントBuser-Bで、Bがid-clip通常の方法で作成されたsshキーを持っているとします(ssh-keygen)。

次に、user-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"、およびその指定されたコマンドのみが、キーid-clipを使用してへのssh接続を開始するたびに実行されますhost-A - 書かれているコマンドに関係なくssh、コマンドラインを

コマンドはスクリプトファイルを示します allowed-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

への最初の呼び出し sshマシンでB

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

文字列to-clipboardallowed-commands.sh環境変数によって渡されますSSH_ORIGINAL_COMMAND。さらに、によってのみアクセスされるid-clip行からキーの名前を渡しましauthorized_keysid-clip

この線

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

は、クリップボードが書き込まれていることを通知するポップアップメッセージボックスです。これもおそらく優れたセキュリティ機能です。(notify-sendUbuntu 18.04で動作しますが、他では動作しない可能性があります)。

ラインで

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

--display :0プロセスにはクリップボード付きの独自のXディスプレイがないため、このパラメーターが必要です。そのため、明示的に指定する必要があります。この値:0は、ウェイランドウィンドウサーバーを備えたUbuntu 18.04で動作します。他のセットアップでは機能しない場合があります。標準Xサーバーの場合、この答えが役立つ場合があります。

host-A /etc/ssh/sshd_config パラメーター

最後に、接続の許可、およびパスワードなしでのみ-key を使用する許可を確実にするために設定する必要がある/etc/ssh/sshd_configホストのいくつかのパラメーター:Assh

PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no
AllowUsers user-A

sshdサーバーに構成を再読み取りさせるには

sudo systemctl restart sshd.service

または

sudo service sshd.service restart

結論

それを設定するのは多少の努力ですがto-clipboard、同じフレームワークで並行して他の機能を構築することができます。


1
リモート転送を備えたXselは、i3をローカルで実行しているUbuntu 18.04で私に有効な唯一の回答でした。X11転送は必要ありません。
ジェイスタンリー


2

最も単純な解決策は、ターミナルを使用してOS Xを使用していて、リモートサーバーでsshを使用していて、テキストファイル、ログ、またはcsvの結果を取得したい場合は、次のようにします。

1)Cmd-K端末の出力をクリアする

2)cat <filename>ファイルの内容を表示する

3)Cmd-S端末出力を保存する

ファイルの最初の行と最後の行を手動で削除する必要がありますが、この方法は、インストールする他のパッケージに依存したり、「リバーストンネル」を使用して静的IPを取得したりするよりも少し簡単です。


+1は、私が使用した便利なテクニックです。ビットを使用すると、端末の履歴が失われ、(前述のように)最初と最後の行の問題は少し厄介です。
アランストーム

同意済み@AlanStorm
tw0000

このアプローチのより重大な問題は、端末バッファーが保持する行数のみを保存することです。多くの場合、問題ではないのですが、あなたはしているが、ログファイルの内容をつかむしようとしているならば、あなたは容量が不足することがあり、その
シュリダールSarnobat

それは本当の@ Sridhar-Sarnobatであり、一般的にあまり良い解決策ではありません。使うだけscp
tw0000
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.