
Android スマートフォンからデスクトップ クリップボードを設定するスクリプトを作成しました。
#!/bin/sh
ssh -Y user@host "export DISPLAY=:0; echo -n $(termux-clipboard-get) | xclip -selection clipboard"
スクリプトは期待どおりに機能しますが、終了しません。プロンプトに戻るにはCtrl+を押す必要があります。C
オプションを使用しました-f
が、すぐに戻ります。 差出人man ssh
:
-f
ssh
コマンド実行の直前にバックグラウンドに移行するよう 要求します。これはssh
、パスワードまたはパスフレーズを要求するが、ユーザーがバックグラウンドで実行することを望んでいる場合に便利です。[…]
これが正しい解決方法かどうかはわかりません。バックグラウンドで実行する必要はありません。コマンドを実行して戻るだけです。
なぜ返品できないのですかssh
?ssh -f
良い方法ですか? もっと良い方法はありますか?
答え1
からこの答え:
X での選択は、2 つの X クライアントが連携して行います。1 つの X クライアントが選択 (プライマリ、セカンダリ、クリップボード) があると主張し、選択を貼り付けたい別の X クライアントが、選択を受信する最初のクライアントに連絡します。
あなたの場合、元のプロセスxclip
は終了しますが、その子プロセスは選択範囲を持っていると主張し、貼り付けたい将来のクライアントのために機能するために存続します。 どうやら完全には切り離されず、SSH サーバーはそれが終了するのを待つようです。そのため、クライアントはそれが終了するのを待ちます。 したがって、 +ssh
が必要です。CtrlC
その後、別のクライアントが選択権を持っていると主張すると、リモートxclip
は終了し、ローカルのブロックが解除されますssh
。つまり、 を使用した回避策は-f
それほど悪くありません。バックグラウンド プロセスは蓄積されず、停止する は最大で 1 つになりますssh
。
リンクされた回答は、多少関連があると思われる問題を解決しようとしています。もう一つの答えアドバイスがありますxsel
。実際、私のテストではこれはブロックされません:
ssh -Y user@host "export DISPLAY=:0; echo -n foobar | xsel -i -b"
xclip
に変更することxsel
は重要です。それでも、元のコマンドをさらに改善することができます。
-Y
リモートコマンドはローカルXサーバーとやり取りしないので、 (または)は必要ないと思います。目的のディスプレイを指すように右を-X
設定するだけで十分です。DISPLAY
xsel
地元にxsel
。は必要ありません
export
。変数は にのみ関連するxsel
ため、次のスニペットで十分です。DISPLAY=:0 xsel -i -b
重大な欠陥。
$(termux-clipboard-get)
ローカルで展開され、そこから取得したものはtermux-clipboard-get
リモートシェルに渡す文字列に埋め込まれます。解釈されたコードとして。例えば、
termux-clipboard-get
が返された場合; rm -f /very/important/file; true
、リモートシェルが実行されますexport DISPLAY=:0; echo -n ; rm -f /very/important/file; true | …
何をするのか分かりますか? 正しい方法は、次のようにパイプすることです
ssh
:termux-clipboard-get | ssh user@host 'DISPLAY=:0 xsel -i -b'
この方法では、出力が
termux-clipboard-get
コードとして扱われることはありません。意図的に末尾の改行文字なしで
echo -n
出力していたのだと思います。そうであれば、末尾の改行をローカルで削除してtermux-clipboard-get
頼らないecho
:printf '%s' "$(termux-clipboard-get)" | …
最終的な形式は次のようになります。
printf '%s' "$(termux-clipboard-get)" | ssh user@host 'DISPLAY=:0 xsel -i -b'
このコマンドは、バイナリとして解釈され変更されないデータからでも末尾の改行文字を削除することに注意してください。NUL 文字も問題になります。データをそのまま渡す必要がある場合は、直接パイプしてくださいtermux-clipboard-get
。
termux-clipboard-get | ssh …