我以前曾经工作过一次,但由于某种原因它无法在我的新系统上工作。
我有.kde4/Autostart/一个名为 ssh-agent 的符号链接01-sshagent,然后是一个名为的简单脚本02-sshkeys,如下所示:
/usr/bin/ssh-add $(find $HOME/.ssh/keys -type f | egrep -v '\.pub$')
Run Code Online (Sandbox Code Playgroud)
问题似乎是,当我启动时,ssh-agent 运行正常,但 KDE 不会保留输出并将其存储在环境中,因此对于每个 Konsole 会话,我必须运行以ps查找 PID,然后手动类型:
SSH_AUTH_SOCK=/tmp/ssh-YtvdiEtW3065/agent.3065; export SSH_AUTH_SOCK;
SSH_AGENT_PID=<pidnumber>; export SSH_AGENT_PID;
Run Code Online (Sandbox Code Playgroud)
...只是为了让它工作,它确实...就在那个 Konsole 窗口中。
我尝试删除上述符号链接,并让 ssh 脚本看起来像这样:
/usr/bin/ssh-agent | sh
/usr/bin/ssh-add $(find $HOME/.ssh/keys -type f | egrep -v '\.pub$')
Run Code Online (Sandbox Code Playgroud)
但是,代理变量并不在会话中,并且从未提示我输入密钥的密码。
我显然错过了一些东西,但它是什么?
Could not open a connection to your authentication agent当我尝试使用-AOpenSSH 客户端的代理转发选项 ( )从中间服务器连接到第三台服务器时收到错误消息。使用加载到ssh-agent. 尝试连接到最终服务器时会显示错误消息。
我的 OpenSSH 客户端设置为允许使用ForwardAgent yesin转发,~/.ssh/config中间服务器AllowAgentForwarding yes在守护进程的配置文件中。客户端配置不会被系统级文件覆盖。
我没有使用终端多路复用器,以避免因未设置环境变量而导致错误。要运行代理,我使用exec ssh-agent zsh和验证两个SSH_AUTH_SOCK和SSH_AGENT_PID存在于当地的环境。我用来ssh-add分别为中间服务器和最终服务器添加私钥;我验证它们添加了ssh-add -l.
所有服务器都是最新版本 (OpenSSH 5.3),客户端是 OpenSSH 6.2。
我将 ssh 配置为使用 GPG 作为我的 ssh 代理,如果我删除了该~/.ssh文件夹,我可以使用我的 gpg 密钥通过 ssh 进入我的服务器。但是,我的~/.ssh文件夹中有十多个不同的 ssh 密钥,如果我在它存在时尝试 ssh,我会收到权限被拒绝错误,因为我的 ssh 客户端在尝试密钥之前提供了目录中的每个私钥gpg SSH 代理。
使用常规 ssh 密钥,我只使用文件中的IdentityFile配置~/.ssh/config,但我不能这样做,因为我的身份是 gpg cardno。我很困惑为什么 ssh 更喜欢密钥文件而不是代理。有没有办法强制 ssh 使用代理而不是文件?或者更好的是,有没有办法在~/.ssh/config文件中指定gpg 密钥必须用于给定服务器?
我已经确认ssh-agent没有运行并且gpg-agent正在运行并ssh-add -L显示我的 gpg 密钥存在,以及一个其他 ssh 样式的私钥。
我正在编写一个同步脚本来同步一些网络环境。
例如:从生产更新集成(主要是为了获取新的数据库行和上传的文件)
我的一些先决条件是:
我希望开发人员连接到集成ssh -A以允许脚本使用他们的密钥连接到生产服务器:
+-------------+ SSH +-------------+ rsync +-------------+
| Developer | ---------> | Integration | --------> | Production |
| computer | | Platform | <-------- | platform |
+-------------+ +-------------+ +-------------+
(priv DSA key) (pub DSA key) (pub DSA key)
Run Code Online (Sandbox Code Playgroud)
它适用于sshor scp,但我无法让 rsync 使用转发的密钥连接到生产服务器。
我看到了类似的问题,但是 rsync 是从用户的计算机运行的,因此 ssh 密钥文件可能会被-i选项指向。
我担心的不是密码短语,因为此脚本将由真实用户(不是 cron)运行
我试图像这样将远程 shell 指定为 rsync:
rsync -e "ssh -A" user@production
但没有运气。
我正在寻找一种从身份验证代理中提取公钥的方法。在将密钥添加到 ssh-agent ( ssh-add ~/.ssh/id_rsa)后,我希望能够将公钥写入文件。
ssh-add -l 为我显示指纹,但有没有办法获得完整的公钥?
谢谢你的建议
公司政策要求安全存储一些 ssh 密钥,例如存储在专用 USB 设备上。使用 gnupg 和 来使用未存储在主机上的密钥可以完美地工作enable-ssh-support,即使使用多个密钥时也是如此:
Host example.com
HostName ssh.example.com
IdentityFile ~/.ssh/smartcard.pub
Host example.net
HostName git.example.net
IdentityFile ~/.ssh/another-smartcard.pub
Host example.org
HostName sftp.example.org
IdentityFile ~/.ssh/id_rsa.pub
IdentitiesOnly yes
PasswordAuthentication no
PubkeyAuthentication yes
Run Code Online (Sandbox Code Playgroud)
但是,当拔掉硬件时,gpg 会从代理中删除密钥,随后的 ssh 调用会导致:
Enter passphrase for key '/home/user/.ssh/smartcard.pub':
Run Code Online (Sandbox Code Playgroud)
这看起来很奇怪,因为 ssh 和 ssh-agent 都应该清楚该文件仅包含公钥。如果 ssh 无法访问指定的密钥,是否有一种好方法可以让 ssh 详细失败,而不是要求输入(毫无意义的)密码?
不完整的解决方案:
IdentitiesOnly- ssh 然后将按预期尝试所有可用密钥- 但会导致服务器限制每个会话的身份验证尝试出现问题alias ssh='grep ^4096 <(ssh-add -l)' && ssh'- 有效,但如果有人想找出他的 ssh 设置被破坏的原因,则会引起头痛我正在尝试让 SSH 代理从我的 Mac 转发到 Debian 服务器。在我的 Mac 上,我已确认我拥有:
SSH_AUTH_SOCK 存在ssh-add -l 显示我的身份./ssh/config 具有启用 ForwardAgent 的设置无密码登录远程服务器工作正常。但是,那里没有我的身份,并且 SSH_AUTH_SOCK 为空。
我想了解这是如何在远程环境中设置的,以及我缺少什么才能使其工作?
更新:
我的服务器是AllowAgentForwarding=yes在 sshd_config 和ForwardAgent=yesssh_config 中设置的。
我找到了一些建议运行的教程,所以我尝试了,但我怀疑这是针对客户端机器的。当我在我的服务器上运行它时,它确实设置了一个 SSH_AUTH_SOCK,但它似乎没有连接回客户端代理,并且显示“代理没有身份”。eval ``ssh-agent
我正在编写一个脚本来循环浏览已知主机名的列表,以便找到一个可以使用我的 SSH 密钥进行身份验证的工作 SSH 服务器。
密钥已经加载了ssh-agentand ssh-add,因此如果我连接到知道我的密钥的工作远程主机,则不会提示密码,并且我无需任何交互即可成功连接。
事情是,当远程主机不知道我的密钥时,ssh会用密码提示我(它没有机会成功,因为如果可以的话,由于 ,它已经让我登录了ssh-agent)。我想防止这种行为并ssh在ssh-agent身份验证失败时中止。
我目前正在使用以下命令绕过大部分交互,但我无法阻止我刚刚描述的交互:
$ ssh -i ~/.ssh/id_rsa \
-o UserKnownHostsFile=/dev/null \
-o KbdInteractiveAuthentication=no \
-o StrictHostKeyChecking=no \
-o PreferredAuthentications=publickey \
-o ConnectTimeout=1 \
$host -n "whoami"
Run Code Online (Sandbox Code Playgroud)
感谢您的回答。
我的 resolv.conf 搜索顺序中有许多本地域。当我连接到不合格(没有 DNS 后缀)主机名时,我非常希望默认转发 SSH 代理。我能想到的最好的办法是 ~/.ssh/config 中的以下内容:
Host *.edu
ForwardAgent no
Host *.com
ForwardAgent no
Host *.net
ForwardAgent no
Host *.org
ForwardAgent no
Host *
ForwardAgent yes
Run Code Online (Sandbox Code Playgroud)
除了列出我仍然想转发的 edu/com/net/org 的已知后缀,例如 .srv.example.com。
对于具有主机命名前缀约定(例如用于 Fedora 系统的 fc-*)的站点,一个简单的通配符条目可以与它们匹配,但这不适用于通用名称或无前缀名称。
有没有比上面丑陋的黑客更好的方法来做到这一点?
我在 .bashrc 文件中添加了以下行,以启动 ssh-agent(如果它未运行)。
if [ -z "$SSH_AUTH_SOCK" ];then eval `ssh-agent -s`;ssh-add ~/.ssh/my_private_key;fi
Run Code Online (Sandbox Code Playgroud)
但每次我再次登录时,ssh-agent 进程的数量都会增加如何避免这种情况。请查看以下日志并告诉我做错了什么。
[vm@localhost ~]$ ssh root@192.168.x.x
Last login: Wed Feb 15 06:32:07 2017 from x.x.x.x
[root@server ~]# pgrep ssh-agent | wc -l
2
[root@server ~]# exit
Shared connection to x.x.x.x closed.
[vm@localhost ~]$ ssh root@192.168.x.x
Last login: Wed Feb 15 06:32:20 2017 from x.x.x.x
[root@server ~]# pgrep ssh-agent | wc -l
3
[root@server ~]# exit
Shared connection to x.x.x.x closed.
[vm@localhost ~]$ ssh root@192.168.x.x
Last login: Wed …Run Code Online (Sandbox Code Playgroud) ssh-agent ×10
ssh ×9
ssh-keys ×3
gpg ×2
forwarding ×1
kde ×1
linux ×1
passphrase ×1
permissions ×1
pgp ×1
rsync ×1