サーバーに接続すると、通常は10から始まり、すべてのユーザーが使用していない最も低い数値である値が割り当てられますssh -X
。 (たとえば、他のユーザーが$ DISPLAYを使用していない場合は10になります。ユーザーがすでに10を使用している場合は11になります。)$DISPLAY
localhost:x.0
x
今私の質問は:実行時にx
数字を指定する方法はありますかssh -X
?100
私の意図は、サーバー上で実行され続け、常にlocalhost:100.0
ディスプレイとして使用される別のプログラムを持つことです。これにより、サーバーへのX接続が失われても再度ログインでき、接続が切断されている間にlocalhost:100.0
他のユーザーが同じポートを占有していることを心配することなく接続を維持できます。デフォルトの10よりも高い数の100を選択すると、ほとんどが占有される可能性がなくなります。
答え1
ssh -Xを実行するときにxに100などの数を指定する方法はありますか?
いいえ、番号を「割り当て」する必要があるだけでなく、sshはその番号に対応するローカルソケットからXプロトコルを渡す必要があるためです。そして、sshが接続されたときに「番号」が無料であるという保証はありません。これがsshがこれにオプションを提供しない理由です。
これにより、サーバーへのX接続が失われても再ログインして、まだlocalhost:100.0への接続を確立できます。
そのサーバーがXサーバーなので動作しません。地元のマシン(sshを介してログインしたマシン)とクライアントプログラムが実行されています。離れてマシン。したがって、すべてのクライアントプログラムは(関連する状態のために)接続を再確立する必要があります。
再接続できるリモートデスクトップが必要な場合は、VNCなどのツールの使用を検討してください。
答え2
私は2つの方法を見つけました。
最初
- ローカルマシンでは、
ssh -X remote
- 表示ポート番号を
echo $DISPLAY | awk -F'[:.]' '{print $2}'
10と仮定して取得します。 - リモートポート6020が使用されていることを確認してください。
lsof -i TCP:6020
使用されていないと仮定します。 - ポート6020から6010への転送:オプションの
ssh -NTR 6020:localhost:6010 localhost
追加(-f
シャットダウンを使用するときにこのプロセスを終了する必要があることを覚えておくこと、推奨)-f
trap "kill $!" EXIT
- 環境を設定します。
DISPLAY=${DISPLAY/:10/:20}
~/.Xauthority
ディスプレイポートがlocalhost:20.0
同じxauthマジックキーを持つように更新されました。xauth add $(xauth list :10 | sed 's/:10/:20/')
または
- 以下を使用せずにリモートでsshを使用します
-X
。ssh remote
- リモートコンピュータグループから
DISPLAY=localhost:20.0
- ローカルシステムからリモートポートを
6020
ローカルシステムのxserverソケットに転送し、オプションで追加します/tmp/.x11-unix/X0
。ssh -NTR 6020:/tmp/.x11-unix/X0 remote
-f
- ローカルシステムのxauthキーをリモートシステムに送信します。 local で
xauth list :0
次のように仮定します。local-hostname:0 MIT-MAGIC-COOKIE-1 hash
- リモートシステムで:実行します
xauth add remote-hostname:20 MIT-MAGIC-COOKIE-1 hash
。
これら2つの方法を比較すると、第1の方法は、ローカルシステムのxauthキーをリモートシステムに転送する必要がない。おそらくより安全(これにより、どのような潜在的なセキュリティ問題が発生する可能性があるかを知らせる専門家がいますか?)。ただし、2つのポートを占有する必要があります。 1つは自分で割り当てられたポートssh -X
、もう1つは使用したいポートです。
答え3
ディスプレイを指定する方法がないことがわかります。
Linux(または少なくともUbuntu)では、モニターは次のようになります/tmp/.X11-unix/
。/tmp/.X11-unix/X0
:0
したがって、ソケットを別のパスに移動でき、それでも機能します。 (これがSSHに渡されたX接続に当てはまるかどうかはわかりませんが、そうかもしれません。)
(しかし、ssh -Y
おそらくより安全ですssh -X
。しかし、長い間、どちらかを使用していません。)
いずれの場合でも、ソケットが閉じられると(SSH接続の終了により)、ソケットで実行されているすべてのプログラムが終了する可能性があります。
永続Xプログラムを実行するには、VNCサーバーを実行し、VNCクライアントを使用して接続することを検討してください。 SSHを使用してVNC接続を安全にトンネリングできます。私はこれを頻繁にします。私は「仮想」モニターでVNCサーバーを実行できると思いますが(VNCクライアントが接続されているときにのみモニターを表示できることを意味します)、私はそうしたことはありません。
修正する
したがって、SSH を介した X11 転送には、次の 3 つの要素を含めることができます。
- 特定ポートのTCPソケット
- DISPLAY変数
- X権限要求を処理するいくつかの形式
これら3つすべてを手動で実行できます。すべてのポートに対して手動転送を使用できます-R
。ディスプレイを手動で設定できます。どういうわけかX権限設定を手動で調整できます(おそらく?)。 X権限を扱うのはおそらく最もトリッキーです。どうすればいいかわかりませんが、可能だと思います。
-X
1、2、3を実行すると、またはを使用せずにX11接続を転送できます-Y
。
私はまだほとんどのXプログラムがサーバーへの接続が閉じられたときにシャットダウンされると疑います。
私はまだVNCサーバーとクライアントを設定すると、より良い結果が得られると信じています。