无法让 ssh-agent 和 ssh-add 在远程服务器上工作

无法让 ssh-agent 和 ssh-add 在远程服务器上工作

我们有一个远程服务器,用于构建软件的某个部分。该构建过程的一部分需要访问私有 bitbucket 存储库。

通常在我的本地计算机中,我设置了 .gitconfig,以便 git 使用 ssh 连接到 bitbucket,并通过启动 ssh 代理eval $(ssh-agent)并使用ssh-add来添加必要的密钥,这样就可以正常工作。

我无法让它在远程服务器上工作。
我尝试执行此操作的方法是连接到远程服务器并运行如下脚本

  ssh -i"${BUILDHOSTKEY}" "${BUILDHOSTUSERNAME}"@"${BUILDHOSTNAME}" << EOF
     eval $(ssh-agent)
     ssh-add ~/route/to/key
     ... rest of build script ...
     
  EOF

尝试时,我得到的输出是代理已使用代理 pid 启动,但失败ssh-add并出现错误:连接到代理时出错:没有这样的文件或目录。这表明它无法访问代理套接字(如果我理解正确的话)

这里出了什么问题?我对设置此类事情很陌生,所以请毫不犹豫地解释甚至是基础知识。

答案1

简短回答:要么您在遥控器上有钥匙,但您只是忘记了勾号'EOF' ,要么您在区域设置上有钥匙,但徒劳地希望这是将钥匙转移到遥控器的方法。在第二种情况下,通过其他安全方式(例如scp -p)将您的密钥传输到远程或上传您的密钥偏僻的公共身份密钥(假设您已经生成了一个)到 bitbucket。

长答案:

只需输入ssh-agent看看这里发生了什么。

(或者

cat  << EOF
     echo Would do remotely   eval $(ssh-agent)
     echo Would do remotely   ssh-add ~/route/to/key
     echo -------------
EOF

或者

ssh -i"${BUILDHOSTKEY}" "${BUILDHOSTUSERNAME}"@"${BUILDHOSTNAME}" << EOF
     echo WOULD DO   eval $(ssh-agent)
     echo WOULD DO   ssh-add ~/route/to/key
EOF

如果你觉得我在建议不相关的废话。)

输出包含类似的内容

SSH_AUTH_SOCK=/tmp/ssh-XXXXXXEEUQSV/agent.43806

这是本地计算机上 ssh-agent 的 Unix 域套接字地址。这是您的计算机本地的,并且在远程计算机上不存在(希望如此!)。

两台机器上都不存在这样的套接字文件。也许你想写

#  Note  ' ' on the following line -----------------here-------------\--\
ssh -i"${BUILDHOSTKEY}" "${BUILDHOSTUSERNAME}"@"${BUILDHOSTNAME}" << 'EOF'
     eval $(ssh-agent)
     ssh-add ~/route/to/key
     ... rest of build script ...
EOF

if~/route/to/key在远程计算机上有效。

评论。如果你知道自己在做什么,你也可以尝试类似的事情ssh-agent bash -c 'ssh-add ~/route/to/key; ssh -A -i"${BUILDHOSTKEY}" "${BUILDHOSTUSERNAME}"@"${BUILDHOSTNAME}"'

更新:评论表明cat <<EOFvscat <<'EOF'部分解决了问题。人们可以通过创建临时文件来获得更多控制权

echo 'echo This will expanded on remote: $VAR $(hostname; ls file) ' > file.$$
echo "echo This will be expanded locally: $VAR $(hostname; ls -l file) ' >> file.SS
echo "ls -l /dir/file # This list the remote file anyway " >> file.$$
ssh ....  < file.$$

或者我们可以使用反斜杠转义:

ssh ....  <<EOF
echo This will expanded on remote: \$VAR \$(hostname; ls file)
echo This will be expanded locally: $VAR $(hostname; ls file)
ls -l /dir/file # This list the remote file anyway
EOF

(未测试)

相关内容