Bash
SSH
Who

sshログインと同時に、何かコマンドを実行して、そのままログイン状態を保つ

ログインと同時に who を実行したい。
サーバ側の .bashrc とかに書いておけば良いが、サーバ全ての .bashrc に who を仕込むのは面倒。

-t オプションを使えば上手くいくという記事があった。

参考:SSHログイン時のコマンド実行 - sodomojoにっき

ssh hostname who だと、接続先で who が実行されたのかもわからない。

 [~]% ssh 192.168.1.20 who
 [~]%

ssh -t hostname who ならば、実行結果がわかるようになる。

ターミナル画面
 [~]% ssh -t 192.168.1.20 who
kanemu   pts/0        2018-01-04 11:14 (192.168.1.2)
Connection to 192.168.1.20 closed.
 [~]%

-t オプション は、「仮想端末を割り当てる」オプションらしい。

-t 強制的に仮想端末を割り当てます。これはリモートマシン上で任意の画面ベースのプログラムを実行するとき(たとえば、メニューサービスを実装するときなど)に非常に便利です。複数の-t をつけると、たとえssh がローカル側での端末を持っていない場合でも強制的に仮想端末を割り当てます。

参考:SSH (1) man page

ssh hostname [command] は、sshの接続先でcommandを実行するためのもの。実行し終わったら閉じてしまう。
ただし、コマンドが動いているうちは閉じないので、 tail -f とかなら control + c で読み込みをやめるまで閉じない。

ならば、 /bin/bash をそのまま実行して、対話式シェルが動いている状態にすればログイン先に留まってくれる、ということらしい。

bash -l オプションをつけて、環境変数をそのまま引き継ぐようにして実行する。

ターミナル画面
% ssh 192.168.1.20 -t "echo '> who' && who && /bin/bash -l"
> who
kanemu   pts/0        2018-01-04 11:29 (192.168.1.2)
[kanemu@example ~]$

リサーチ中に知ったことメモ

sshrc

sshrc をインストールすれば、~/.sshrc に書いたコマンドを各サーバで実行してくれるらしい。

参考:sshした先に.bashrcや.vimrcを持って行きたい人のためのsshrc - Qiita

使ってみたが、多段SSHで他サーバを踏み台にすると上手くいかなかった。

多段sshの方法について

他サーバを踏み台にしてログインするには、 -t オプションを使う方法の他に、ProxyCommand を使う方法があるらしい。
ググりワードは「多段ssh」か「踏み台サーバ」とかで出る。

# 192.168.1.10 を踏み台に 192.168.1.20 にログイン
ssh -t 192.168.1.10 ssh 192.168.1.20
# ProxyCommandを使う方法
ssh -o ProxyCommand='ssh -W %h:%p 192.168.1.10' 192.168.1.20