有没有办法使用密钥登录来ssh-copy-id复制另一个密钥,而无需手动编辑~/.ssh/authorized_key.
手册页中似乎有-o ssh_option,我尝试传递 -i 选项,但这似乎不起作用。
ssh-copy-id -o "-i ~/.ssh/working-key" -i ~/.ssh/new-key user@ip
Run Code Online (Sandbox Code Playgroud)
您正在寻找的选项是IdentityFile,但默认情况下它不起作用:ssh-copy-id这是一个 shell 脚本,期望使用其-i参数来复制公钥和进行身份验证的私钥,作为一种方式检测重复条目的创建(注意:如果没有-f,除了要复制的公钥之外,私钥副本还必须可用,以便能够进行身份验证)。但是-o IdentityFile覆盖-i给ssh内部的参数ssh-copy-id会让人ssh-copy-id相信密钥已经被授权,因为它可以在没有密码的情况下连接,并给出最终结果:
$ ssh-copy-id -o 'IdentityFile=.ssh/working-key' -i .ssh/new-key.pub user@ip
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: ".ssh/new-key.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
Enter passphrase for key '.ssh/working-key':
/usr/bin/ssh-copy-id: WARNING: All keys were skipped because they already exist on the remote system.
(if you think this is a mistake, you may want to use -f option)
Run Code Online (Sandbox Code Playgroud)
添加-f将使其工作(注意:然后不需要私钥的可用性),因为没有检查会失败。运行该命令两次将不再是幂等的:它将再次在远程的authorized_keys.
这没有被视为问题可能是因为它在ssh-agent使用时运行良好:如果working-key在代理中加载(但不是new-key),则将ssh-copy-id -i .ssh/new-key.pub user@ip按预期工作。再次运行将检测到重复项。
简而言之:
ssh-agent, 并加载working-key它,-f -o IdentifyFile=~/.ssh/working-key但它不会检测重复项,ssh-agent。这是一个包装器,可以为您执行此操作:如果它没有找到已经运行的ssh-agent,它将临时为单个操作生成一个。如果存在,它将被使用(并且添加的密钥将保持添加状态,我希望保持简单)。它将非常简单地处理附加选项:添加的选项 ( -I) 必须位于第一个(如果存在),然后是其单独的参数,请随意改进它(可能通过使用某种 case 循环)。我还采取了额外的步骤,不询问已加载到可用代理中的密钥的密码(使用此 Q/A)。
wrapper-ssh-copy-id.sh:
#!/bin/sh
if [ x"$1" = x-I ]; then
if [ $# -lt 2 ]; then
exit 1
fi
privkeyfile="$2"
shift 2
if [ -z "$SSH_AUTH_SOCK" ]; then
trap 'eval $(ssh-agent -k)' EXIT
eval $(ssh-agent)
fi
fingerprint=$(ssh-keygen -lf "$privkeyfile" | awk '{print $2}')
if [ -z "$fingerprint" ]; then
exit 1
fi
ssh-add -l | grep -F -q "$fingerprint" || ssh-add "$privkeyfile"
fi
ssh-copy-id "$@"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1328 次 |
| 最近记录: |