デスクトップからリモートサーバー上のsshを介したコマンドでスクリーンセッションを起動するにはどうすればよいですか?


57

デスクトップの単一のsshコマンドからリモートサーバーでスクリーンセッションを起動できるようにしたい。ただし、画面には端末が必要なようです。端末は、sshを介してコマンドを実行するときに使用できません。

だから明らか

ssh root@my.machine screen "tail -f /var/log/messages"

(例として)動作せず、与える

Must be connected to a terminal.

後でログインして、手動で起動した画面セッションに接続できるように、sshが画面の下でコマンドを起動するようにします。


余談ですが、画面の不適切な使用を介さずにこのエラーを検出できます。ファイルから読み取るためにexec <fooを実行していたシェル関数がありました。かなり後で、大きなスクリプトで画面を起動しようとしました。obvの下のすべてのメソッド。本当の犯人は幹部だったので失敗しました。心に留めておくべきもの。自分の標準入力を誤って削除していないことを確認してください。
ニールマクギル

回答:


77

sshに-tオプションを使用してみてください

ssh -t root@my.machine screen "tail -f /var/log/messages"

man sshから

-t擬似tty割り当てを強制します。これを使用して、arbi-
        リモートマシン上の三次画面ベースのプログラム。
        メニューサービスを実装する場合など、非常に便利です。複数の-t
        sshにローカルttyがない場合でも、オプションはttyの割り当てを強制します。

私はtmux ssh -t user@machine tmux attachで同じことを試みており、リモートtmuxセッションをアタッチできますが、文字エンコーディングが乱れています。ASCII文字のみが表示されます。これに対する修正はありますか?
マカリオ

1
@Macarioでは、これについて別の質問を開きたいかもしれませんが、ssh -tで実行しているので接線的に関連していますが、対話型と非対話型のLC_ *の設定に関連しているようです。コマンドラインをsshに渡して実行すると、非対話型環境で実行されます。非対話形式で実行するときにTERM環境変数が渡されていない可能性もあります。その場合、tmuxは端末が実際に持っている機能を認識せず、最小公分母に戻ります。
Kjetil Joergensen

私はsshを使用していませんが、同じ問題に直面しています。助けてください。serverfault.com/questions/861632/unable-to-run-code-in-screen
zhangjinzhou

32

次を使用できます。

ssh root@host screen -m -d "tail -f /var/log/messages"

コマンドを実行すると、切り離された画面が起動します。

   -m   causes screen  to  ignore  the  $STY  environment  variable.  With
        "screen  -m"  creation  of  a  new session is enforced, regardless
        whether screen is called from within  another  screen  session  or
        not.  This  flag has a special meaning in connection with the `-d'
        option:

   -d -m   Start screen in "detached" mode. This creates a new session but
           doesn't  attach  to  it.  This  is  useful  for  system startup
           scripts.

1
あなたの答えも同様に良かったのですが、あまりにも悪く、私は選択しなければなりません。誰かが最初の回答を編集して、あなたの情報を追加する必要があるかもしれません。
トーマスヴァンダースティチェレ2009年

8

遅い答えですが、これは私がやっていることです、私はこれを行うエイリアスを作成します(tと呼びましょう):

ssh $MYSERVER -a -x -t screen -xRR -A -e^Zz -U -O

これはssh、エージェントとX11転送を無効にするよう指示しscreen、実行中のセッションにアタッチし、必要に応じて新しいセッションを開始^Zし、ブレークアウトコマンドとして使用し、UTF-8を使用して端末について賢くするよう指示します。

これはすべて、端末tを開いて入力し、$ MYSERVERで画面セッションを開くことができることを意味します。その後、別のターミナルを開いて同じことを行い、同じセッションに別のウィンドウを表示できます。

同じ画面セッションに複数のターミナルウィンドウを配置すると、2つの画面タブを同時に表示できるようになります。


1
私が探していたものにまったく答えていないのにかなりの数のページを読みましたが、あなたはそれを打ちました。最近では、ほとんどのサーバーにscreenまたはtmuxのいずれかがおそらく接続されていると想定しています。接続するサーバーは一時的なものである可能性があるため、ほとんどの回答が示唆するようにbashrcをいじりたくありませんでした。また、これをシェルの関数にして、$ hostや$ commandなどの引数を受け入れることもできます(最後に追加します)。そしてt、単一のホストであるエイリアスをハードコーディングするのではなく、ssh_configでホスト名と組み合わせることができます。
dragon788

@ dragon788確かに、私は今それを関数にして、$ MYSERVERを「$ @」に置き換えました。私は今でもこれをたくさん使っています。
w00t

4

サーバーの〜/ .bashrcファイルに次の行を追加すると、サーバーに初めてログオンしたときにスクリーンセッションが開始されます。既に実行されている場合は、そのセッションに再接続されます。

これは非常に便利です。

if [ -n "$SSH_CONNECTION" ] && [ -z "$SCREEN_EXIST" ]; then
    export SCREEN_EXIST=1
    screen -DRi
fi

私はこれを試してみましたが、screen -lsそうするとスクリーンセッションが表示されません
-Tarun
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.