シェル環境変数に格納されているキーをSSHに渡すには?

シェル環境変数に格納されているキーをSSHに渡すには?

おそらく複数のsshアクセスを試みましたが、最初の読み取りの後に破壊されます。fdfd

# ssh -i <(echo $KEY) [email protected]
Warning: Identity file /dev/fd/11 not accessible: Bad file descriptor.
[email protected]: Permission denied (publickey).

一時ファイルを書き込んだり削除したりすることなく他の方法がありますか?

答え1

export MYKEY=`cat key.pem`
ssh-add - <<< "$MYKEY"
ssh [email protected]

答え2

長すぎます。いいえ、でも見てください。XYの問題

$ strace -f ssh -i <(cat ~/.ssh/id_rsa) user@server echo test
...
close(63)
...
newfstatat(AT_FDCWD, "/dev/fd/63", 0x7ffc4f1d0c60, 0) = -1 ENOENT (No such file or directory)
write(2, "Warning: Identity file /dev/fd/6"..., 77Warning: Identity file /dev/fd/63 not accessible: No such file or directory.) = 77

だから何らかの理由でsshfdが最初に閉じられました。たぶん、標準記述子を除くすべての記述子を閉じることもできます。

それにもかかわらず、あなたの家は間違っています。

おそらくsshはfdに複数回アクセスしようとしますが、最初の読み取りの後にfdが破壊されます。

fdを処理する前に、 1つのシステムコールがありますstatclose(63)うん、それ以降に台無しだった。

答え3

これは使用されるソリューションであり、ssh-agent実行には必要ありません。

ssh-agent bash -c "ssh-add <(echo '$MY_SSH_KEY') && ssh ..."

したがって、エージェントは「デーモン化」されず、SSHセッションがアクティブな間にのみ存在します。

答え4

あるいは、キーが書かれたら一時的なkill -9(aなしで)治療が保証されているセキュリティファイルを許可できます。この Bash ヘルパー関数を使用してsshscp、 をラップし、sftpキーを最初の引数として渡すことができます。

with-ssh-key() (
    # Bash wrapper for OpenSSH CLI tools (ssh, scp, sftp, or any that accept
    # the `-i /path/to/keyfile` option) that allows for passing an SSH private
    # key as the first parameter rather than via a persistent identity file.
    # This is something that is not possible with ssh tools by default.
    #
    # This command is useful when storing the key in an environment variable
    # that is set in some secure way, such as set via secrets mastered in the
    # AWS Parameter Store, or as the result another command in a subshell.
    #
    # The "OPENSSH PRIVATE KEY" lines at the beginning and end of the passed
    # key string will be added if they are not on already present.
    #
    # Usage: with-ssh-key {ssh | scp | sftp} KEY ADDITIONAL_ARGS...
    #
    # Examples:
    #   key="b3blbnnzaC1rZXktdjEAAAAABG5vbmUAAAA[etc...]"
    #   with-ssh-key "$key" ssh myserver echo Hello-from-myserver
    #   with-ssh-key "$key" scp myserver:file.txt ./
    #   echo get file.txt | with-ssh-key "$key" sftp myserver
    #
    # A note regarding zsh: this wrapper is not necessary in zsh because zsh
    # has the extremely convenient `=(cmd)` syntax which will create a real
    # on-disk tempfile and clean it up immediately after the calling command
    # exits. Thus you can easily do something like this in zsh to accomplish
    # the same effect as this wrapper:
    #
    #   ssh -i =(echo "$key") ...
    #
    # Or, if you need to add the header/footer lines:
    # 
    #   ssh -i =(echo "-----BEGIN OPENSSH PRIVATE KEY-----\n$(echo "$key")\n-----END OPENSSH PRIVATE KEY-----")
    set -euo pipefail
    key="$1"; shift
    cmd="$1"; shift
    tempkeyfile=$(mktemp)
    chmod 600 "$tempkeyfile" # ensure file is locked down
    trap "rm \"$tempkeyfile\"" 0 2 3 15 # ensure tempfile cleanup in event of various signals
    [[ $key =~ "BEGIN OPENSSH PRIVATE KEY" ]] || echo "-----BEGIN OPENSSH PRIVATE KEY-----" >> $tempkeyfile
    echo "$key" >> $tempkeyfile
    [[ $key =~ "END OPENSSH PRIVATE KEY" ]] || echo "-----END OPENSSH PRIVATE KEY-----" >> $tempkeyfile
    $cmd -i "$tempkeyfile" "$@"
)

関連情報