我想通过 SSH 在我的网络(静态以太网)上的多台计算机之间进行通信。为了做到这一点,我需要在每次登录特定机器时运行 ssh-add,我该怎么做才能设置一次,并且每次登录或重新启动时都不会要求我输入密码我的机器?
我知道有一种方法可以在bash_profile文件中添加一些行,但是每次重新启动/登录到特定机器时我仍然需要输入密码。
if [ -z "$SSH_AUTH_SOCK" ] ; then
eval `ssh-agent -s`
ssh-add
fi
Run Code Online (Sandbox Code Playgroud)
Tho*_*man 418
这是在安全性和便利性之间进行权衡的典型示例。幸运的是,有多种选择。最合适的解决方案取决于使用场景和所需的安全级别。
带密码的 ssh 密钥,没有 ssh-agent
现在每次使用密钥进行身份验证时都必须输入密码。虽然从安全的角度来看这是最好的选择,但它提供了最差的可用性。这也可能导致选择弱密码,以减轻重复输入的负担。
带密码的 ssh 密钥,与 ssh-agent
添加以下内容~/.bash_profile将ssh-agent在登录时自动启动并加载 ssh 密钥:
if [ -z "$SSH_AUTH_SOCK" ] ; then
eval `ssh-agent -s`
ssh-add
fi
Run Code Online (Sandbox Code Playgroud)
现在每次登录时都必须输入密码。虽然从可用性的角度来看稍微好一些,但它有一个缺点,即ssh-agent无论在登录会话期间是否使用密钥,都会提示输入密码。每个新登录还会产生一个不同的ssh-agent实例,即使在注销后,该实例仍会在内存中使用添加的键继续运行,除非明确终止。
要ssh_agent在注销时终止,请将以下内容添加到~/.bash_logout
if [ -n "$SSH_AUTH_SOCK" ] ; then
eval `/usr/bin/ssh-agent -k`
fi
Run Code Online (Sandbox Code Playgroud)
或以下 ~/.bash_profile
trap 'test -n "$SSH_AUTH_SOCK" && eval `/usr/bin/ssh-agent -k`' 0
Run Code Online (Sandbox Code Playgroud)
ssh-agent通过在文件系统中的固定位置创建与代理的持久通信套接字,可以避免创建多个实例,例如在Collin Anderson 的回答中。这是对生成多个代理实例的改进,但是,除非明确终止,否则注销后解密的密钥仍保留在内存中。
在桌面上,桌面环境中包含的 ssh-agents(例如Gnome Keyring SSH Agent)可能是更好的方法,因为它们通常可以在登录会话期间首次使用 ssh-key 时提示输入密码短语,并且将解密的私钥存储在内存中,直到会话结束。
带密码的 ssh 密钥,与 ssh-ident
ssh-ident是一个实用程序,可以ssh-agent代表您进行管理并根据需要加载身份。它只在需要时添加密钥一次,而不管有多少终端、ssh 或登录会话需要访问ssh-agent. 它还可以根据所连接的主机或从中调用 ssh 的目录来添加和使用不同的代理和不同的密钥集。这允许在对不同主机使用代理转发时隔离密钥。它还允许在 GitHub 等网站上使用多个帐户。
要启用ssh-ident,安装它并将以下别名添加到您的~/bash_profile:
alias ssh='/path/to/ssh-ident'
Run Code Online (Sandbox Code Playgroud)
带密码的 ssh 密钥,与 keychain
keychain是一个ssh-agent代表您进行管理并允许ssh-agent在登录会话结束时保持运行的小实用程序。在后续登录时,keychain将连接到现有ssh-agent实例。实际上,这意味着只有在重新启动后第一次登录时才必须输入密码。在后续登录时,将ssh-agent使用来自现有实例的未加密密钥。这对于在cron没有无密码 ssh 密钥的作业中允许无密码 RSA/DSA 身份验证也很有用。
要启用keychain,请安装它并将如下内容添加到~/.bash_profile:
eval `keychain --agents ssh --eval id_rsa`
Run Code Online (Sandbox Code Playgroud)
从安全角度来看,ssh-ident和keychain比糟糕ssh-agent局限于特定会话的生存情况,但他们提供的便利性高的水平。为了提高 的安全性keychain,有些人将--clear选项添加到他们的~/.bash_profile钥匙串调用中。通过这样做,必须在登录时重新输入密码,但cron在用户注销后,作业仍然可以访问未加密的密钥。该keychain wiki页面有更多的信息和示例。
没有密码的 ssh 密钥
从安全的角度来看,这是最糟糕的选择,因为私钥在暴露时完全不受保护。但是,这是确保在重新启动后无需重新输入密码的唯一方法。
ssh-key with passphrase, with ssh-agent,将密码传递给 ssh-add 脚本
虽然ssh-add从脚本中传递密码似乎是一个简单的想法,例如echo "passphrase\n" | ssh-add,这并不像ssh-add 从 中读取密码那样直接stdin,而是/dev/tty直接打开以供阅读。
这可以被合作周围有expect,用于自动化交互式应用程序的工具。以下是使用脚本中存储的密码添加 ssh 密钥的脚本示例:
#!/usr/bin/expect -f
spawn ssh-add /home/user/.ssh/id_rsa
expect "Enter passphrase for /home/user/.ssh/id_rsa:"
send "passphrase\n";
expect "Identity added: /home/user/.ssh/id_rsa (/home/user/.ssh/id_rsa)"
interact
Run Code Online (Sandbox Code Playgroud)
请注意,由于密码以明文形式存储在脚本中,因此从安全角度来看,这并不比使用无密码 ssh-key 好。如果要使用这种方法,重要的是要确保expect包含密码短语的脚本具有适当的权限设置,使其只能由密钥所有者读取、写入和运行。
Col*_*son 133
将此添加到您的~/.bashrc,然后注销并重新登录以生效。
if [ ! -S ~/.ssh/ssh_auth_sock ]; then
eval `ssh-agent`
ln -sf "$SSH_AUTH_SOCK" ~/.ssh/ssh_auth_sock
fi
export SSH_AUTH_SOCK=~/.ssh/ssh_auth_sock
ssh-add -l > /dev/null || ssh-add
Run Code Online (Sandbox Code Playgroud)
这应该只在您每次重新启动后第一次登录时提示输入密码。ssh-agent只要它保持运行,它就会继续重复使用。
Gui*_*zar 26
与 OP 的问题没有密切关系,但它可能对其他人有用:因为 7.2.0 ssh(1) 有一个选项,允许在第一次身份验证时向 ssh-agent 添加密钥;该选项AddKeysToAgent,可以设置为yes,no,ask,或confirm,全系统或您的个人.ssh/config文件。
参考:https : //www.openssh.com/txt/release-7.2
ssh-agent 缓存各种未锁定的 ssh 密钥,因此您可以使用密码保护 ssh 密钥,而不必每次都键入它们。
为了缓存未锁定的密钥,显然需要解锁这些密钥。要解锁用密码锁定的密钥,显然需要知道这些密码。
任何不需要人类授权的方法(例如“输入密码”)不仅会使您的系统不安全;它也会使 ssh-agent 的整个目的变得毫无意义。
说了这么多,您可以简单地使用不受密码保护的 ssh 密钥(Enter在密钥生成过程中要求输入密码时点击)。由于没有任何密码,ssh-agent因此无需向您索要密码即可(不)缓存它。
我不会推荐您在登录时使用 ssh-add (需要打开 ssh-agent)。这是因为您无法控制 ssh-agent 部分何时结束,并且当您不需要在一个登录部分使用密钥文件时可能会产生安全风险。
相反,我建议编写一个脚本来打开 ssh-agent 的部分子 shell,自动添加所有密钥文件,并在需要使用 ssh 时调用。如果您可以采纳,请继续阅读。
你会有两个选择:
删除密钥的所有密码,如果您的密钥文件被盗,这些密码的安全性很弱。(因此不推荐)
对您的密钥使用相同的密码。然后,当您 时ssh-add keyfile1 keyfile2 ...,您只需在每个部分输入一次密码。
在这两种情况下,您都可以编写这样的脚本文件“ssh_keys_section.sh”,如下所示:
#!/bin/bash
# This script run a ssh-agent on a sub-shell and automatically ssh-add all keyfiles at once.
# This agent ends when you type `exit` to close the sub-shell.
exec ssh-agent bash -c "ssh-add /path/to/keyfile1 /path/to/keyfile2 ...; exec bash"
Run Code Online (Sandbox Code Playgroud)
评论:
ssh-keygen -p -f keyfile/path/to/yourterminal &(取决于操作系统)来分叉更多共享相同解锁密钥的终端这是一种自动化 SSH 密码的解决方法。
创建一个单行脚本,将您的密码打印到标准输出,例如:
echo 'echo MY_SSH_PASSWORD' > ~/.print_ssh_password && chmod 700 ~/.print_ssh_password
Run Code Online (Sandbox Code Playgroud)
重要提示:确保复制前导空格以防止将密码存储到历史记录中。
并使用以下方法之一。
使用标准输入方法:
cat ~/.ssh/id_rsa | SSH_ASKPASS=~/.print_ssh_password ssh-add -
Run Code Online (Sandbox Code Playgroud)或命名管道方法:
mkfifo --mode 0600 ~/.ssh_fifo
Run Code Online (Sandbox Code Playgroud)ssh-add通过指定用于身份验证的程序运行:
cat ~/.ssh/id_rsa >~/.ssh_fifo | SSH_ASKPASS=~/.print_ssh_password ssh-add ~/.ssh_fifo
Run Code Online (Sandbox Code Playgroud)请参阅:man ssh-add阅读更多关于SSH_ASKPASS.
| 归档时间: |
|
| 查看次数: |
419555 次 |
| 最近记录: |