【问题标题】:Automating ssh-add private keys with a common password使用通用密码自动化 ssh-add 私钥
【发布时间】:2021-01-24 11:11:31
【问题描述】:

我已经搜索过,但我发现的解决方案只专注于使用单个密钥文件。 假设我有一组需要相同密码的私钥(从安全角度来看,我对这样的设置感到满意)。

我如何制作一个bash 脚本,该脚本从stdin 读取密码并使用相同密码为每个私钥调用ssh-add

我没有可用于ssh-add-p

我试图避免将密码写入文件(即使是临时的)。 到目前为止,我是带着这个来的,但我不确定该怎么走或者这是否可能:

#!/bin/bash

if [ $(ps ax | grep [s]sh-agent | wc -l) -gt 0 ] ; then
    printf "> 'ssh-agent' is running.\n"
else
    printf "> 'ssh-agent' needs to be running. Exiting.\n"
    exit 0
fi

unset password
prompt="> Please input your password: "
while IFS= read -p "$prompt" -r -s -n 1 char
do
    if [[ $char == $'\0' ]]
    then
         break
    fi
    prompt='*'
    password+="$char"
done

printf "\n> Adding key files...\n"

## declare an array variable
declare -a arr=("key-1.ppk" "key-2.ppk" "key-3.ppk")

## now loop through the above array
for i in "${arr[@]}"
do
   #echo "$i"
   ssh-add "$i" < <(echo "$password")   

done

还尝试将以下内容传递给stdin

echo $password | ssh-add "$i"

我也想过在循环中使用这个:

{
/usr/bin/expect << EOF
  spawn ssh-add $HOME/.ssh/$i
  send "$password\r"
  expect eof
EOF
}

但是它会要求我为每个单独的键输入密码,从而破坏了自动化的目的。 除非有办法让单个spawn ssh-add 通过expect 接收一个密码(只有一个提示)并添加多个密钥?

【问题讨论】:

    标签: bash ssh automation


    【解决方案1】:

    如果所有密钥的密码相同,则可以将多个密钥传递给ssh-add,它只会提示输入一次密码并将所有这些密钥添加到 ssh-agent。

    例如:

    $> arr=("id_ecdsa" "new_test_key")
    $> ssh-add ${arr[@]}
    Enter passphrase for id_ecdsa:
    Identity added: id_ecdsa (test_user@host_test)
    Identity added: new_test_key (test_user@host_test)
    
    $> ssh-add -l
    256 SHA256:urYhdMK9UZyLl+p8cC7ehdImYfvsmtJFtQmESWoczmM test_user@host_test (ECDSA)
    256 SHA256:53obuQkRzLGW5iUJdmFPNvSK1quUSlCi4gbQkKsJinY test_user@host_test (ECDSA)
    
    

    【讨论】:

    • 感谢您的信息。 ssh-add 能够像这样以数组的形式接收它们,这简化了事情。
    【解决方案2】:

    密码可以通过环境变量传递:

    #!/usr/bin/env bash
      
    read password
    
    ssh_askpass=$HOME/.ssh_askpass
    
    echo 'echo "$password"' > $ssh_askpass; chmod 700 $ssh_askpass
    
    ppk=key-1.ppk
    export password
    SSH_ASKPASS="$ssh_askpass" ssh-add $ppk < /dev/null
    
    rm -f "$ssh_askpass"
    

    【讨论】:

    • 虽然这个很有用,但它确实存在写入磁盘的不便(当然,我没有在我的问题中指定该限制)。不过,对您的答案进行投票,因为它很有用。
    • @Blitzkoder,已更新,现在密码由环境变量传递。
    猜你喜欢
    • 2013-02-12
    • 2016-01-08
    • 2015-05-03
    • 2017-12-14
    • 1970-01-01
    • 2023-03-21
    • 2011-09-24
    • 2016-12-28
    • 1970-01-01
    相关资源
    最近更新 更多