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


24

私はこの質問を始めましたが、開いている間に答えました。この質問を投稿し、自分のソリューションでフォローアップし、他の潜在的なソリューションに対して公開したままにします。

<バックストーリー>

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

ssh example.com -t 'tmux attach'

UTF-8の問題は、通常どおりにシェルインし、手動でtmuxセッションにアタッチした場合に発生しない、発生します。

</バックストーリー>

私は私が私の中で設定した他のもののいずれかの影響を与えませんsshのログイン時に何かを開始する再利用可能な方法で、したいです.zshrc(またはあなたの.bashrcない私の開発環境で、必要な場合がありますが、まだbashのを使用している場合)を非常に言われたマシンで時々ローカルで作業しているときに表示されます。

回答:


13

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

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

ほとんどのsshデーモンは、を除く環境変数の送信を拒否するように構成されていますLC_*。sshデーモンでexample.com許可されている場合、カスタム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を介した環境変数の受け渡しに関する詳細情報が含まれています。


私が使用しssh example.com -t 'tmux attach'ていない理由は、環境の読み込みに問題があるからではなく、UTF-8文字の表示に問題があるからです。従来の方法で接続する場合、この問題は存在しません。このため、この質問は、SSH経由で接続した直後にスクリプトを実行することに関するものです。
-connrs

あなたのソリューションが大好きです。エレガント
11年

@connrs:を実行してもUTF-8に問題があります.profileか?この問題は、ターゲットマシンのロケールが正しく設定されていない/etc/profileか、または.profile修正されたためだと思いました。ロケールの問題は、おそらくより多くの情報で修正可能です。
ジル「SO-悪であるのをやめる」

これをテストするためにオフィスに戻りたいと思いました。あなたは完全に正しいです、/ etc / profileをソースすることは適切な振る舞いを引き起こします。あなたは今、このより一般的な質問をするように私を動機づけた問題を実際に解決しました
-connrs

6

Eli Headyが以下のコメントでより良い提案をするまでPermitUserEnvironment yes、環境変数を設定して追加することを以前にアドバイスしました。~/.ssh/environment

.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ますが、他のマシンで使用できるように、ドットファイルを整理しておくのが好きです。

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

スクリプトがtmuxに渡すMY_SSH_CONNECTION="yes"tmux attachにどのように設定するかに注意してください。これは、上記とまったく同じスクリプトにアクセスし、再帰を防ぐシェルを開くためです。


2
PermitUserEnvironmentの使用は、潜在的なセキュリティの影響により、一部の環境では使用できません。SSHは$ SSH_CONNECTION変数を設定します。これは、.zloginの$ SSH_LOGINの代わりに使用でき、〜/ .ssh / environmentを使用する必要がなくなります。のような何かif [[ "$SSH_CONNECTION" != "" ]]がそれを行う必要があります。
イーライ酔わ

3

私自身、これを私の.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を呼び出さない)では機能しません。中止すると、シェル関数が再接続するように設定されます。


すばらしいです!代わりにbashrcを追加することでこれをf *できました。その後、新しい画面ウィンドウごとに-.profileに変更するとうまくいきました。
ヒューゴ

0

あなたは走ることを検討するかもしれません

ssh remotehost -t screen -DR

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


私の質問で述べたように、セッションを管理するためにGNU画面ではなくtmuxを使用しています。そして、ロードされたとき、-t 'tmux attach'私は通常存在しないvimの問題を抱えています。これが、スクリーン/セッション管理ではなく、ssh connectでのスクリプトの実行に関する本当の疑問です。私の質問で明確にされていないことをお
ologiesびし

申し訳ありませんが、tmuxについて言及されましたが、それは私には何の意味もありません。新しいツールに言及してくれてありがとう!
sehe

0

UTF-8の問題を具体的に話すために、追加する場合

SendEnv LANG

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


0

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

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