スクリーンとSSHを効果的に使用するには?


12

ログインが常にスクリーンセッションに再接続されるように、SSHとスクリーンを設定したいと思います。理想的には、Cdを押すとそのセッションは終了せずに切り離されます。どうすればこれを達成できますか?また、SSHライフを簡単にするために、他にどのような便利な設定がありますか?

回答:


9

SSH経由で接続すると自動的にScreenセッションに入れられるように、すべてのサーバーに対して次のことを行いました。

ユーザーアカウントの〜/ .bashrcに次を追加します。

# Auto-screen invocation. see: http://taint.org/wk/RemoteLoginAutoScreen
# if we're coming from a remote SSH connection, in an interactive session
# then automatically put us into a screen(1) session.   Only try once
# -- if $STARTED_SCREEN is set, don't try it again, to avoid looping
# if screen fails for some reason.
if [ "$PS1" != "" -a "${STARTED_SCREEN:-x}" = x -a "${SSH_TTY:-x}" != x ] 
then
  STARTED_SCREEN=1 ; export STARTED_SCREEN
  screen -RR -S main || echo "Screen failed! continuing with normal bash startup"
fi
# [end of auto-screen snippet]

これにより、mainという名前のスクリーンセッションが存在しない場合は開始され、存在する場合は再接続されます。これは、さまざまなサービスのために切り離されて実行されている他のいくつかのスクリーンセッションがあり、それらに接続したくないためです。


実行中の画面セッションからデタッチするために、CTRL-dキーの組み合わせが画面の標準であることを追加したかっただけです。
デーモンのカオス

8

リモートサーバーの.bash_profileに次のものがあります。

if [ -z "${STY}" -a -t 0 -a X${USER} = Xarcege ]; then
    reattach() {
        if [ -n "${SSH_AUTH_SOCK}" ]; then
            ln -snf "${SSH_AUTH_SOCK}" "${HOME}/.ssh/agent-script"
            SSH_AUTH_SOCK="${HOME}/.ssh/agent-script" export SSH_AUTH_SOCK
        fi
        exec screen -A -D -RR ${1:+"$@"}
    }
    screen -wipe
    echo 'starting screen... (type Ctrl-C to abort)'
    sleep 5 && reattach
fi

これは2つのことを行います:最初に、シェルを置き換えてssh-agent接続を引き継ぐシェル関数をセットアップし、2番目に(画面を開始したくない場合に)数秒間休止した後に関数を呼び出します。

ifまだ実行中の画面(-z "${STY}")が端末(-t 0)に接続されておらず、sudoを実行していない場合(これは変更されないことがあります$USER)、最初の句はtrueになります。

このreattach関数は、ssh-agentポートがアクティブな状態でsshが呼び出されたかどうかを最初にチェックします(-n "${SSH_AUTH_SOCK}")。次に~/.ssh/agent-script、現在アクティブなソケットファイルで現在のものを置き換え、環境変数($SSH_AUTH_SOCK)を新しい値で置き換えます。次に、スクリプトは現在のシェルを1つのscreenセッションに置き換えます(1つだけのセッションが存在することを確認します)。reattach関数の引数はすべてコマンドに渡されます(${1:+"$@"})。

最後の部分では、最初にデッドセッションを削除し(screen -wipe)、ユーザー(私)に画面がまもなく開始されることを知らせ、代わりにCtrl- を押してシェルに戻ることができCます。次に、5秒間待機し、reattach関数を呼び出します。


4

まず、byobuを使用する場合、常に自動的にbyobuを開始するように新しいシェルセッションを構成できます(これは基本的には素晴らしい画面構成ですが、新しいバージョンではtmuxをバックエンドとして使用できます)。本当にbyobuが必要ない場合は、おそらく、自分.profileまたは他のシェル構成スクリプトをexec screenifに編集して、手動で接続するように画面を設定できますTERM != "screen"

気に入らない場合は、このauthorized_keysファイルを使用して、特定のキーとの接続に対して特定のコマンドを実行できます(また、必要な数のキーを使用できます)。詳細man sshdを参照してください。画面が実行されて接続されているかどうかを確認するスクリプトをコマンドに実行させるか、新しいセッションを開始することをお勧めします。

Ctrl-Dでの切断については、画面ででキーマッピングを設定できます.screenrc。詳細man screenを参照してください。「bindkey」を探しています。


2

質問とはまったく無関係かもしれませんが、代わりにTMUXの使用を検討したことがありますか。すぐに使用できる多くの機能を実行します。

例えば。TMUXの使用中にSSHセッションから切断した場合、必要なことは、sshに戻って「tmux a」を実行してセッションに接続することだけです。TMUXの使用を開始して以来、nohup / disownコマンドが何であるかを忘れていました...何かを実行してログアウトする必要がある場合は、tmux内で実行して切り離します。コマンド出力はバッファリングされるため、後で確認できます。

自動的に添付するには、次のようなものを.bashrcに追加できます。

[ -z $TMUX ] && tmux list-sessions 2>/dev/null && tmux a

またはさらに簡単

tmux a 2>/dev/null

それはより少ないメモリフットプリントと全体的に私見よりもはるかに優れた/使いやすいオプションを持っています。

meta-dショートカットは、TMUXでデタッチするデフォルトのマッピングです。


0

screen -dAr default || screen -AS default私のために働く。私はそれを〜/ .bashrcます

スイッチの簡単な説明:

  • d -画面がまだ接続されている場合は、別のセッションから画面を切断します。
  • A -画面のウィンドウを新しい端末サイズに合わせます。
  • r default -デフォルトと呼ばれる画面に接続します。

最初のスクリーンコマンド(前のコマンド||)が成功しない場合、2番目のスクリーンコマンドが実行されます。

  • A -上で説明したように...
  • S default-defaultという名前で新しいスクリーンセッションを作成します

0

byobuを使用することを勧めします。このツールはtmuxを使用し、素敵なツールバーとその他の便利なウィンドウ切り替え機能、ホットキーなどを提供します。

echo "new-session" >> ~/.byobu/.tmux.conf
echo "if [ -n '\$TMUX' ]; then :; else byobu attach; fi" >> ~/.bashrc

上記のコマンドを使用すると、SSHログインに成功した後、システムに既存のbyobu-tmuxセッションに試行して接続し、そうでない場合は新しいセッションを作成します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.