bash - Bash 脚本在输入密码时不生效
问题描述
我不想自动登录到 ssh 代理,但只在“sh”文件中有效执行简单的脚本:
#!/bin/bash
clear
echo " >> Start the ssh-agent in the background."
eval $(ssh-agent -s)
echo " >> Add SSH private key to the ssh-agent"
ssh-add ~/.ssh/id_rsa
echo " >> List of ssh agents"
ssh-add -l
echo " >> Attempts ssh to GitHub"
ssh -T git@github.com
它确实触发了密码请求并等待输入,即使不在主目录中。git 通知“添加的身份:”和“您已成功通过身份验证”
但问题是在尝试与 Github 通信后 - 'git push' 或 'pull' 命令没有任何积极作用:
sign_and_send_pubkey: signing failed: agent refused operation
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
在那个问题之后,我可以从键盘输入相同的命令。
ssh-add ~/.ssh/id_rsa
输入密码,然后它使我能够与 Github 成功通信。上面的脚本有什么问题?
我的背景:
OS name: "linux", version: "4.15.0-76-generic", arch: "amd64", family: "unix"
解决方案
ssh-agent
通过设置一堆环境变量来告诉你的shell如何与之通信。它将它们打印到 STDOUT 并将eval $(ssh-agent -s)
它们转换为环境变量。重要的一个是 SSH_AUTH_SOCK,它指向用于与代理通信的套接字文件。
$ echo $SSH_AUTH_SOCK
/tmp/path/to/the/socket
环境变量只对当前进程及其子进程持续存在。您的 shell 程序在一个新进程中执行。在你的 shell 程序中设置的任何环境变量都会随着 shell 程序而消失。您的外壳将不知道如何与代理交谈。
你有两个选择。
首先,您可以执行您的 shell 程序,而不是执行source
它。这会在您当前的 shell 中将其作为一系列 shell 命令运行,就像您键入它们一样。脚本设置的环境变量将保持不变。
其次,更好的是ssh-agent
在您登录时开始。有很多方法可以做到这一点,具体取决于您的操作系统。您可能已经有一个正在运行。检查$SSH_AUTH_SOCK
。
PSecho " >> List of ssh agents"
应该是echo " >> List of ssh keys"