概要
以下、同僚の話である.
同僚 A は、リモート Linux に対して頻繁に scp でデータを転送していたが、
毎回ログインパスワード入力をしていて手間であった.
そこで上司に対してパスワード入力が省略できる「SSH公開鍵認証を行いたい」と
訴えたが、上司が次のように (意味不明な理由を) 言って拒否した.
「パスワード入力が省略できてしまうなんてダメです」
「毎回、パスワードを入力することに意味があるんです」
個人的には、このような上司の意見は無視して SSH公開鍵認証をしてしまえば良いと思うが、
同僚は次のようにして律儀に守ったようである.
実装
ローカルにある local.data を、リモートLinux の /tmp/. に配置する場合を例とする.
SSH_ASKPASS
を使って「パスワードを標準出力するプログラム」を指定している.
そして「パスワードを標準出力するプログラム」は一時ファイルを用いたようである.
ここでのリモートLinux のログインパスワードは「password」である.
#!/bin/bash
# 一時ファイルを作成する. 作成された一時ファイルの絶対パスが TMPF に格納される.
TMPF=`mktemp`
# ソフトウェア割り込みが発生したら掴まえてパスワード表示プログラム「$TMPF」を削除する
trap "test ! -z \"$TMPF\" && rm -f $TMPF && exit 1" 1 2 15
# パスワード表示プログラムを「$TMPF」に書き出す
cat <<'EOL' > $TMPF
#!/bin/bash
echo 'password'
EOL
# パスワード表示プログラム「$TMPF」に実行権限を付与する
chmod +x $TMPF
# 環境変数「SSH_ASKPASS」に「$TMPF」の絶対パスを指定するだけでなく、
# 環境変数「DISPLAY」を空にして、且つ setsid を指定して実行する.
DISPLAY='' SSH_ASKPASS=$TMPF setsid scp -rp local.data <アカウント>@<IP>:/tmp/.
# 最後にパスワードが記された「$TMPF」を削除する.
rm -f $TMPF
以上.