首页 > 解决方案 > 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"

标签: bashgitsshpassphrase

解决方案


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"


推荐阅读