Borderline ServerFaultの質問ですが、私はプログラミングいくつかのシェルスクリプトなので、最初にここで試しています:)
ほとんどの* nixには、出力をローカルクリップボード/ペーストボードにパイプ/リダイレクトし、そこから取得できるコマンドがあります。 OS Xでは、これらのコマンドは
pbcopy, pbpaste
とにかくこの機能を別のサーバーにSSHで複製する方法はありますか?あれは、
そして、はい、私はマウスを使用してコマンドからテキストを選択するだけでよいことを知っていますが、クリップボードに直接出力を出力するワークフローに非常に慣れているので、リモートセッションでも同じことが必要です。
コードは便利ですが、一般的なアプローチも歓迎されます。
同じ種類のソリューションを探していたので、このスレッドを復活させています。そして、私に合ったものを見つけました。 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
私の好きな方法は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
リバースSSH接続を必要としない優れたソリューションを見つけました!
リモートホストでxclipを使用し、OSXシステムでssh X11転送とXQuartzを使用できます。
これを設定するには:
,
)ssh -X remote-Host "echo 'hello from remote-Host' | xclip -selection clipboard"
既存のすべてのソリューションには以下が必要です。
xclip
は問題なく動作します)またはこれを行う別の方法がありますが、コンピューターへのsshの方法を変更する必要があります。
私はこれを使い始めましたが、見た目ほど威圧的ではないので試してみてください。
ssh [email protected] -R 2000:localhost:2000
(ヒント:これをキーバインドにして、入力する必要がないようにします)
nc -l 2000 | pbcopy
注:pbcopy
がない場合は、ファイルにtee
します。
cat some_useful_content.txt | nc localhost 2000
実際、sshセッションの途中であってもトンネルを開始する方法はありますが、見た目ほど悪くないものから人々を怖がらせたくありません。ただし、興味がある場合は詳細を後で追加します
xclip や XSel など、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
、必要に応じて。
これは、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セッションを開始するラッパースクリプトを作成できます。これが私にとっての仕組みです。楽しい。
ワンライナーではありませんが、追加のsshは不要です。
netcat
をインストールしますcat ~/some_file.txt | nc termbin.com 9999
。これにより、出力がtermbin
Webサイトにコピーされ、URLが出力に出力されます。もちろん、機密性の高いコンテンツには使用しないでください。
この答えは、セキュリティを追加することで 選択した答え の両方で展開されます。
その答えは、一般的な形式を議論しました
<command that makes output> | \
ssh <user A>@<Host A> <command that maps stdin to clipboard>
セキュリティが不足している可能性があるのは、_ssh
パーミッションにあり、<user B>
上のHost B>
がssh
をHost A
に入れ、anyコマンドを実行できます。
もちろん、B
からA
へのアクセスは、既にssh
キーによってゲートされている可能性があり、パスワードを持っている場合もあります。ただし、別のセキュリティレイヤーでは、B
がA
で実行できる許容コマンドの範囲を制限できます。 rm -rf /
を呼び出せないようにします。 (これは、ssh
キーにパスワードがない場合に特に重要です。)
幸いなことに、ssh
にはcommand restrictionまたはforced commandと呼ばれる組み込み機能があります。 ssh.com 、またはこの serverfault.com question を参照してください。
以下のソリューションは、ssh
コマンド制限が適用された一般的なフォームソリューションを示しています。
このセキュリティ強化ソリューションは一般的な形式に従います-Host-B
のssh
セッションからの呼び出しは単純です:
cat <file> | ssh <user-A>@<Host A> to_clipboard
これの残りはそれを機能させるためのセットアップを示しています。
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
マシンssh
のB
への元の呼び出しは
... | 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
以外の関数は同じフレームワークで並行して構築できます。
@rhileighalmgrenソリューションは良いですが、pbcopyは迷惑なように最後の「\ n」文字をコピーします。これを防ぐために「head」を使用して最後の文字を削除します。
#!/bin/bash
head -c -1 | ssh desktop pbcopy
私の完全なソリューションはこちらです: http://taylor.woodstitch.com/linux/copy-local-clipboard-remote-ssh-server/
ターミナルを使用してOS Xを使用していて、リモートサーバーでsshを実行していて、テキストファイル、ログ、またはcsvの結果を取得する場合の最も簡単なソリューションは、次のとおりです。
1)Cmd-K
ターミナルの出力をクリアする
2)cat <filename>
ファイルの内容を表示する
3)Cmd-S
ターミナル出力を保存する
ファイルの最初の行と最後の行を手動で削除しますが、この方法は、インストールする他のパッケージに頼ったり、「逆トンネル」や静的IPなどの取得を試みるよりも少し簡単です。