何を言っているんだと思われるかもしれないですが、気軽にパスワードの1文字目に「~」を使わないほうがいいというお話です。
起こった問題
踏み台サーバー経由でサーバーAに接続して作業をしていた時の話です。
いわゆる多段 ssh 接続というもので、リモートワークになってからは結構使われる方も多いかと思います。
サーバーA上で root 権限になろうと sudo su -
してパスワードを入力したら Connection to xxx.xxx.yyy.zzz closed.
の文字とともにサーバーAから追い出されてしまいました。
なにかの間違いだろうと何度か挑戦していたのですが、結果はサーバーAから切断され踏み台サーバーに戻る羽目に。。。
そのときに入力していたパスワードが ~.xxxxxxxxxx
のような ~
から始まるものでした。
調査
~
って何か意味があったよなーと思ってどう調べようかと考えましたが、どうも今回は ssh の動作が原因っぽい。
そこで man ssh
でマニュアルを確認すると、下記のような記述がありました。
ESCAPE CHARACTERS
When a pseudo-terminal has been requested, ssh supports a number of func‐
tions through the use of an escape character.
A single tilde character can be sent as ~~ or by following the tilde by a
character other than those described below. The escape character must
always follow a newline to be interpreted as special. The escape charac‐
ter can be changed in configuration files using the EscapeChar configura‐
tion directive or on the command line by the -e option.
The supported escapes (assuming the default ‘~’) are:
~
チルダさん、エスケープ文字じゃないっすか!
さらに man ssh
さんは静かに語ります。
~. Disconnect.
~.
は Disconnect... なるほど。。。
原因
レアケースだけど起きうる、今回の流れを整理しました。
- 踏み台 (bastion) サーバー経由でサーバーAに多段 ssh 接続
-
sudo su -
で root 権限になる際に、パスワードを求められる - パスワードが
~.
で始まるものであった -
~.
は ssh 接続を閉じるコマンド😇 - パスワードを入力しているつもりなのに、2文字目の
.
を入力した途端 ssh がサーバーAの接続を閉じて踏み台サーバーに戻る
結果、パスワード入力中に接続が閉じられる奇妙なことに。。。
(ちなみに、パスワードの途中というか2文字目以降に ~.
の文字があっても問題はありません。)
対応策
今回は ~/.ssh/config
にエスケープ文字を変える設定を追加して逃げました。
Host ServerA
# エスケープ文字を @ に変更
EscapeChar @
これで無事、パスワード入力でも接続を閉じられることはなくなりました。
当然、変更したエスケープ文字 @.
を入力すると接続は切れます😇
他にも man ssh
さんいわく、 -e
オプションでエスケープ文字を都度変えることも可能だそうです。
今回は次回接続時に同じ罠にはまらぬようファイルに設定として書きました。
これはなんかゴリ押し感が。。。なんか他に正しい解決策があるような気がします。。。
感想
悪いことは言わない。 ~
チルダから始まるパスワードは止めとけ。
…という気持ちになりました。
ssh の ~
エスケープ文字は ~.
だけでなく、 ~B
や ~C
などいろいろありますので。。。
今回は手作業でログインしていましたが、自動化を考えるとやはりパスワードでこのような動きをされるのは困ります。
いっそ、記号から始まるパスワードは念の為止めておいたほうがいいのかもしれません。
皆様のパスワード設定規則の一つの考慮案になれば幸いです。