sshコマンドが終了しない

sshコマンドが終了しない

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設定するだけで十分です。DISPLAYxsel地元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 …

関連情報