web-dev-qa-db-ja.com

SSH経由で接続した直後にスクリプトを実行するにはどうすればよいですか?

この質問をし始めましたが、開いている間に答えました。私はこの質問を投稿し、私の解決策でフォローアップし、他の潜在的な解決策に開いたままにします。

_<_ backstory _>_

私はtmuxとvimのユーザーです。フラッシュムービーでカーネルパニックが発生したときに、Ubuntu開発マシンが暴走することを心配する必要がないので、リモートvimの動作が好きです。 tmuxを実行すると、再起動後に開いているファイルが待機し、中断したところから続行できます。次のように接続すると、tmuxセッションでvimを実行するときに問題が発生しました。

_ssh example.com -t 'tmux attach'
_

UTF-8の問題は、通常のシェルで手動でtmuxセッションに接続する場合に発生しない問題を発生させます。

_<_/backstory _>_

だから私はsshログインで何かを開始する再利用可能な方法を望んでいます、それは私が_.zshrc_(またはbashをまだ使用している場合は_.bashrc_)で構成した他のことには影響しません私の開発環境では必須ですが、そのマシンでローカルに時々作業しているときには表示されません。

24
connrs

ssh example.comを実行すると、sshデーモンがログインシェルを起動し、ログインシェルが~/.profile(または~/.bash_profileまたは~/.zprofileまたは~/.loginに応じて読み取りますログインシェルで)。リモートで実行するコマンドを指定すると(-tの有無にかかわらず)、sshデーモンは通常のシェルを起動するため、.profileは読み取られません。療法:

ssh example.com -t '. /etc/profile; . ~/.profile; tmux attach'

LC_*以外のほとんどのsshデーモンは、環境変数の送信を拒否するように構成されています。 example.comのsshデーモンで許可されている場合は、カスタムLC_*変数を悪用してtmuxを自動的に起動することができます。これを~/.profileに入れます。

if [ -n "$LC_tmux_session" ] && tmux has -t "$LC_tmux_session"; then
  exec tmux attach -t "$LC_tmux_session"
Elif [ -n "${LC_tmux_session+1}" ] && tmux has; then
  exec tmux attach
fi

次に、LC_tmux_session= ssh example.comまたはLC_tmux_session=session_name ssh example.comを使用してログインします。

この回答 は、sshを介して環境変数を渡すことについての詳細情報を持っています。

以前にPermitUserEnvironment yesを設定し、~/.ssh/environmentに環境変数を追加することをお勧めしました Eli Heady 以下のコメントでより適切な提案。

.zlogin(bash:.bash_profileなど)を開き、以下を入力します。

if [[ "$SSH_CONNECTION" != "" && "$MY_SSH_CONNECTION" != "yes" ]]; then
    while true; do
        echo -n "Do you want to attach to a tmux session? [y/n]"
        read yn
        case $yn in
            [Yy]* ) MY_SSH_CONNECTION="yes" tmux attach; break;;
            [Nn]* ) break;;
            * ) echo "Please answer y/n";;
        esac
    done
fi

以下からのインスピレーション: Linuxシェルスクリプトで入力を求めるにはどうすればよいですか?

.zloginファイルを使用しましたが、.zshrcファイルを使用することもできますが、dotfilesを整頓しておき、それを分離して使用できることに注意してください他のマシン上

質問を自分に適したものに置き換え、MY_SSH_CONNECTION="yes" tmux attachをその時点で実行したいものに置き換えます。

スクリプトがMY_SSH_CONNECTION="yes"の前にtmux attachを設定してtmuxに渡す方法に注意してください。これにより、上記とまったく同じスクリプトにアクセスし、再帰を防ぐシェルも開きます。

6
connrs

私自身、これを.bash_profileファイルに追加します。

if [ -z "$STY" ]; then
    reattach() { exec screen -A -D -RR ${1:+"$@"} ; }
fi
if [ -t 0 ]; then
    screen -wipe
    echo 'starting screen... (type Ctrl-C to abort)'
    sleep 5 && reattach
fi

これにより、スクリーンセッションへの再接続または作成を中止する時間ができます。 「ssh system command」形式(〜/.* profileを呼び出さない)では機能しません。中止するとシェル機能が再接続するように設定されています。

3
Arcege

追加すると、UTF-8の問題について具体的に説明します。

SendEnv LANG

そして、$LANGはローカルエンドでen_US.UTF-8のようなものに設定され、リモートエンドのsshdはSendEnvディレクティブを許可します(sshd_configAcceptEnvを使用) )、反対側のtmuxはそれを尊重する必要があります。しばらくこの問題が発生し、トラブルシューティングが困難でした。

0
Chris W.

接続するたびに実行する場合は、リモートマシンのtmux attachの下部に~/.profileを追加するだけです。

0
linesarefuzzy

あなたは実行を検討するかもしれません

ssh remotehost -t screen -DR

そこでターミナルセッションを実行します。その後、(^A^D)をデタッチして、後で(別のクライアントからも)再アタッチできます。画面が完全なインタラクティブターミナルセッションを保持するため、非インタラクティブな初期化の問題が解消されます(オプションでログオンシェル、man screen(1)または^A?)。

0
sehe