この質問をし始めましたが、開いている間に答えました。私はこの質問を投稿し、私の解決策でフォローアップし、他の潜在的な解決策に開いたままにします。
_<
_ backstory _>
_
私はtmuxとvimのユーザーです。フラッシュムービーでカーネルパニックが発生したときに、Ubuntu開発マシンが暴走することを心配する必要がないので、リモートvimの動作が好きです。 tmuxを実行すると、再起動後に開いているファイルが待機し、中断したところから続行できます。次のように接続すると、tmuxセッションでvimを実行するときに問題が発生しました。
_ssh example.com -t 'tmux attach'
_
UTF-8の問題は、通常のシェルで手動でtmuxセッションに接続する場合に発生しない問題を発生させます。
_<
_/backstory _>
_
だから私はsshログインで何かを開始する再利用可能な方法を望んでいます、それは私が_.zshrc
_(またはbashをまだ使用している場合は_.bashrc
_)で構成した他のことには影響しません私の開発環境では必須ですが、そのマシンでローカルに時々作業しているときには表示されません。
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に渡す方法に注意してください。これにより、上記とまったく同じスクリプトにアクセスし、再帰を防ぐシェルも開きます。
私自身、これを.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を呼び出さない)では機能しません。中止するとシェル機能が再接続するように設定されています。
追加すると、UTF-8の問題について具体的に説明します。
SendEnv LANG
そして、$LANG
はローカルエンドでen_US.UTF-8
のようなものに設定され、リモートエンドのsshdはSendEnv
ディレクティブを許可します(sshd_config
でAcceptEnv
を使用) )、反対側のtmuxはそれを尊重する必要があります。しばらくこの問題が発生し、トラブルシューティングが困難でした。
接続するたびに実行する場合は、リモートマシンのtmux attach
の下部に~/.profile
を追加するだけです。
あなたは実行を検討するかもしれません
ssh remotehost -t screen -DR
そこでターミナルセッションを実行します。その後、(^A^D
)をデタッチして、後で(別のクライアントからも)再アタッチできます。画面が完全なインタラクティブターミナルセッションを保持するため、非インタラクティブな初期化の問題が解消されます(オプションでログオンシェル、man screen
(1)または^A?
)。