web-dev-qa-db-ja.com

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

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

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

pbcopy, pbpaste 

とにかくこの機能を別のサーバーにSSHで複製する方法はありますか?あれは、

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

そして、はい、私はマウスを使用してコマンドからテキストを選択するだけでよいことを知っていますが、クリップボードに直接出力を出力するワークフローに非常に慣れているので、リモートセッションでも同じことが必要です。

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

128
Alan Storm

同じ種類のソリューションを探していたので、このスレッドを復活させています。そして、私に合ったものを見つけました。 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
70
rhileighalmgren

私の好きな方法は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

97

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

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

これを設定するには:

  1. インストール XQuartzsoloist + pivotal_workstation :: xquartz recipe でこれを行いましたが、必要はありません)
  2. XQuartz.appを実行します
  3. XQuartzの設定を開きます(kb_command+ ,
  4. 確認 "同期を有効にする"および "CLIPBOARDの変更時にペーストボードを更新する"チェックされています XQuartz Preferences window example
  5. ssh -X remote-Host "echo 'hello from remote-Host' | xclip -selection clipboard"
28
TrinitronX

SSHサーバーのリバーストンネルポート

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

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

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

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

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

ssh [email protected] -R 2000:localhost:2000

(ヒント:これをキーバインドにして、入力する必要がないようにします)

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

nc -l 2000 | pbcopy

注:pbcopyがない場合は、ファイルにteeします。

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

cat some_useful_content.txt | nc localhost 2000

その他の注意事項

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

9

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

 $ xclip -help 
使用法:xclip [オプション] [ファイル] ... 
読み取りまたは書き込みのためにXサーバーの選択にアクセスします。
 
 -i、-inは、標準入力またはファイルからX選択にテキストを読み込みます。
(デフォルト)
 -o、-outは、選択を標準出力に出力します(通常、
パイピングファイルまたはプログラム)
 -l、-loops終了するまで待機する選択要求の数
 -d、-接続するXディスプレイを表示(例:localhost:0 ")
 -h、-help usage information 
-アクセスする選択範囲( "primary"、 "secondary"、 "clipboard"または "buffer-cut")
 -noutf8はテキストを次のように扱いませんutf-8、古いunicodeを使用します。 ]-詳細な実行コメント
 
バグを<aに報告する[email protected]> 
 $ xsel -help 
使用法:xsel [オプション] 
 X選択を操作します。
 
デフォルトでは、現在の選択が出力され、変更されません。 
標準入力と標準出力の両方が端末(tty)である場合。それ以外の場合、
標準出力が端末
(tty)でない場合、現在の選択が出力され、標準入力
が端末(tty)でない場合、選択は標準入力から設定されます)。入力または出力オプションが指定されている場合、
プログラムは要求されたモードでのみ動作します。
 
入力と出力の両方が必要な場合、前の選択は
です。標準入力の内容で置き換えられる前の出力。
 
入力オプション
 -a、--append標準入力を選択に追加します
 -f、-標準入力が大きくなると選択に追加する
 -i、--input選択に標準入力を読み込む
 
出力オプション
 -o、--output標準出力への選択
 
アクションオプション
 -c、--clear選択のクリア
 -d、--delete選択のクリアを要求し、その
それを所有するアプリケーションは、そのコンテンツを削除します
 
選択オプション
 -p、-primary PRIMARY選択で操作します(デフォルト)
 -s、 --secondary SECONDARY seで操作するlection 
 -b、--clipboard CLIPBOARDの選択で操作します。選択は、
プログラムが出口で選択された後も保持されます。
 -x、--exchange PRIMARYおよびSECONDARYの選択
 
 Xオプション[.____。を交換します。 ] --display displayname 
 Xサーバーへの接続を指定します
 -t ms、--selectionTimeout ms 
 
選択が必要なタイムアウトをミリ秒単位で指定します取得されます。値0(ゼロ)
はタイムアウトなしを指定します(デフォルト)
 
その他のオプション
 -l、--logfileデタッチ時にエラーを記録するファイルを指定します。 
 -n、--nodetach制御端末から切り離しません。 
このオプションがないと、xselは入力、交換、保持モードでバックグラウンド
プロセスになるように分岐します。
 
 -h、--helpこのヘルプを表示し、 exit 
 -v、--verbose情報メッセージを出力します
 --versionバージョン情報を出力し、exit 
 
バグを<[email protected]>に報告してください。 

要するに、xclip -i/xclip -o または xclip -i -sel clip/xclip -o -sel clip または xsel -i/xsel -o または xsel -i -b/xsel -o -b、必要に応じて。

7
ephemient

これは、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セッションを開始するラッパースクリプトを作成できます。これが私にとっての仕組みです。楽しい。

4

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

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

もちろん、機密性の高いコンテンツには使用しないでください。

3
maxbellec

この答えは、セキュリティを追加することで 選択した答え の両方で展開されます。

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

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

セキュリティが不足している可能性があるのは、_sshパーミッションにあり、<user B>上のHost B>sshHost Aに入れ、anyコマンドを実行できます。

もちろん、BからAへのアクセスは、既にsshキーによってゲートされている可能性があり、パスワードを持っている場合もあります。ただし、別のセキュリティレイヤーでは、BAで実行できる許容コマンドの範囲を制限できます。 rm -rf /を呼び出せないようにします。 (これは、sshキーにパスワードがない場合に特に重要です。)

幸いなことに、sshにはcommand restrictionまたはforced commandと呼ばれる組み込み機能があります。 ssh.com 、またはこの serverfault.com question を参照してください。

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

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

このセキュリティ強化ソリューションは一般的な形式に従います-Host-Bsshセッションからの呼び出しは単純です:

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

これの残りはそれを機能させるためのセットアップを示しています。

sshコマンドの制限のセットアップ

Bのユーザーアカウントがuser-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"、およびonlyは、キーid-clipが使用されるたびに実行され、Host-Aへのssh接続が開始されます-どのコマンドが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

マシンsshBへの元の呼び出しは

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

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

この線

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

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

ラインで

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

プロセスにはクリップボードを備えた独自のXディスプレイがないため、パラメーター--display :0が必要です。したがって、明示的に指定する必要があります。この値:0は、Waylandウィンドウサーバーを備えたUbuntu 18.04で動作します。他のセットアップでは動作しない場合があります。標準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

または

Sudo service sshd.service restart

結論

設定には多少の労力がかかりますが、to-clipboard以外の関数は同じフレームワークで並行して構築できます。

3
Craig Hicks

@rhileighalmgrenソリューションは良いですが、pbcopyは迷惑なように最後の「\ n」文字をコピーします。これを防ぐために「head」を使用して最後の文字を削除します。

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

私の完全なソリューションはこちらです: http://taylor.woodstitch.com/linux/copy-local-clipboard-remote-ssh-server/

1
Taylor Hawkes

ターミナルを使用してOS Xを使用していて、リモートサーバーでsshを実行していて、テキストファイル、ログ、またはcsvの結果を取得する場合の最も簡単なソリューションは、次のとおりです。

1)Cmd-Kターミナルの出力をクリアする

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

3)Cmd-Sターミナル出力を保存する

ファイルの最初の行と最後の行を手動で削除しますが、この方法は、インストールする他のパッケージに頼ったり、「逆トンネル」や静的IPなどの取得を試みるよりも少し簡単です。

1
tw0000