私はUbuntu 11.10を使用しています。私は毎日多くのサーバーに接続するためにssh
を使用しているので、.ssh/config
ファイルにそれらのパラメータを以下のように記述しています。
Host Home
User netmoon
Port 22
HostName test.com
このファイルに各接続のパスワードを入れて、サーバがパスワードを要求したときに、端末がパスワードを入力してサーバに送信するようにする方法はありますか?
時々PCから離れて、戻ってパスワードを入力してEnterを押すと、ターミナルがCONNECTION CLOSED
と表示されることがあるので、これが必要です。
追伸:公開鍵と秘密鍵のペアは使いたくありません。
公開鍵/秘密鍵ペアをあまり使いたくない場合は、送信先のアドレスに応じて自動的にパスワードを入力してくれる expect
スクリプトを書くことができます。
編集:私が言いたいのは、一方ではexpect
を使ってパスワードを入力し、他方では設定ファイルから指定されたユーザーとホストのパスワードを読み取るようなスクリプトができるということです。例えば、以下のpythonスクリプトは、晴れの日のシナリオで動作します。
#!/usr/bin/python
import argparse
from ConfigParser import ConfigParser
import pexpect
def main(args):
url = args.url
user, host = url.split('@', 1)
cfg_file = 'ssh.cfg'
cfg = ConfigParser()
cfg.read(cfg_file)
passwd = cfg.get(user, host)
child = pexpect.spawn('ssh {0}'.format(url))
child.expect('password:')
child.sendline(passwd)
child.interact()
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Run ssh through pexpect')
parser.add_argument('url')
args = parser.parse_args()
main(args)
と表示され、設定ファイルのフォーマットは以下のようになります。
[user_1]
host1 = passwd_1
host2 = passwd_2
[user_2]
host1 = passwd_1
host2 = passwd_2
注: 説明したように、sshからのありとあらゆるエラーや質問メッセージ、ありとあらゆるURLを扱うためには、pythonスクリプトをもっと複雑にする必要がありますが(この例では、user@host
のようなものを想定していますが、userの部分はほとんどの場合使われません)、基本的な考え方は同じです。設定ファイルについては、別の設定ファイルを使用するか、.ssh/config
を使用して、そのファイルを解析し、指定されたユーザとホストのパスワードを取得する独自のコードを書くことができます。
この質問](https://askubuntu.com/questions/46930/how-can-i-set-up-password-less-ssh-login)に対する@BrunoPereira氏の回答では、明示的にパスワードを入力せず、sshキーを使わずに接続する代替方法が紹介されています。
スクリプトやエイリアス、関数を ~/.bashrc
に作成して、そのコマンドを素早く実行することができます。
もちろん、この方法には考慮すべきセキュリティ上の問題があります。