👻

pythonでSSH公開鍵をサーバーに追記する【paramiko】

2022/07/05に公開

駆け出しエンジニアのfaneです
リモートサーバーへのSSH鍵の登録を自動化したかったのでpythonでざっと書いてみました。
プログラミング初心者なので不備等あるかもしれませんがご参考までに

作業フローを整理する

リモートサーバーへSSH公開鍵を追加する場合

  1. 追記する対象のサーバーへSSH接続する
  2. サーバーのAuthorized_keysに公開鍵を追記する

とざっくりこの2手順になるかと思います。

実際に書いてみる

というわけでこちらpythonでざっくり書いてみます。
参考にしたのはこちら
https://rurukblog.com/post/python-paramiko-use/


# paramikoのインポート
import paramiko


def add_ssh_key(ipaddress:str,username:str,keypath:str,publickey:str):
    """
    ipaddress: 追記するサーバーのipaddress
    username: サーバーへSSH接続する際のusername
    keypath: サーバーに既に登録してるSSH鍵
    publickey:今回登録する公開鍵文字列
    """
    cmd = f'cd /home/{username}/.ssh ; echo {publickey} >>authorized_keys'
    client = paramiko.SSHClient()
    try:
        client.set_missing_host_key_policy(paramiko.WarningPolicy()) # またはparamiko.AutoAddPolicy()

        # 上記で設定したIPアドレス、ユーザー名、キーファイルを渡す
        client.connect(ipaddress,
        username=username,
        key_filename=keypath,
        timeout=5.0)

        # コマンドの実行
        stdin, stdout, stderr = client.exec_command(cmd)
        # エラーが存在するなら出力させる
        if len(stderr.read()) > 0:

            cmd_errresult = ''
            for line in stderr:
                cmd_errresult += line
            print(cmd_errresult)

    except Exception as e:

        print(e.__str__())

    finally:
        client.close()

paramikoライブラリを使ってSSHした後、echoで追記しています。
今回は運用上文字列で追記することが多かったのでそれに合わせて書いていますが、ファイルで渡されるならそれをreadして書き足すなりすることになると思います。

ちなみに

とここまで書いて思いましたが普通はssh-copy-idで足りる場面が多い気がします。その他もっと良い方法などありましたらコメントいただけると幸いです

Discussion