Git 服务器 Bash 和 SSH

Git 服务器 Bash 和 SSH

我想在运行 Ubuntu 10.04 LTS 的 Linode VPS 上使用基于 SSH 的 Git。

说明看起来很简单,事实上,考虑到我已经设置了 SSH 密钥等。

我所要做的就是指示我的本地存储库发送到服务器

ssh://[email protected]:22/~/mygits/proj1.git

问题是,当我git push origin master这样做时,它只是停顿,没有网络活动,没有错误,几分钟后我用 Ctrl-C 杀死它。我昨天派人去尝试诊断问题。因此,在服务器上,我设置了一个新用户matt2并复制authorized_keysmatt2并尝试推送到中提琴[email protected]:22,它起作用了。

matt 和 matt2 有什么区别?嗯,matt 在他的 .bash_profile 中有这个,以确保 ssh 代理正在运行(我需要这个功能很多):

# Start/Reuse SSH Agent - restart or re-use an existing agent
SSH_AGENT_CACHE=/tmp/ssh_agent_eval_`whoami`
if [ -s "${SSH_AGENT_CACHE}" ]
then
    echo "Reusing existing ssh-agent"
    eval `cat "${SSH_AGENT_CACHE}"`
    # Check that agent still exists
    kill -0 "${SSH_AGENT_PID}" 2>-
    if [ $? -eq 1 ]
    then
        echo "ssh-agent pid ${SSH_AGENT_PID} no longer running"
        # Looks like the SSH-Agent has died, it'll be restarted below
        rm -f "${SSH_AGENT_CACHE}"
    fi
fi

if [ ! -f "${SSH_AGENT_CACHE}" ]
then
    echo "Starting new ssh-agent"
    touch "${SSH_AGENT_CACHE}"
    chmod 600 "${SSH_AGENT_CACHE}"
    ssh-agent >> "${SSH_AGENT_CACHE}"
    chmod 400 "${SSH_AGENT_CACHE}"
    eval `cat "${SSH_AGENT_CACHE}"`
    ssh-add

所以看来我.bash_profile与通过 SSH 操作 git 发生了冲突。有什么解决方法的建议吗?

我不想使用 2 个用户帐户,并且我想保留我的.bash_profile.如果我可以编辑 .bash_profile 并包装功能,那就太好了,if [ $connectingWith != "git-client" ]但我怀疑这样的事情是否存在?

想法?

答案1

我很确定问题是你的.bashrc回声。.bashrc当它不在终端上运行时,切勿打印任何内容,因为这会破坏使用 ssh 进行自动化操作的程序(rsync、git 等)。

事实上,.bashrc如果它不在终端上运行,你不应该做任何事情。把这个放在文件的开头:

if ! [ -t 1 ]; then return; fi

.bashrc文件适用于交互式 shell。 bash 中有一个怪癖,它会为所有 rsh 和 ssh 登录加载此文件,无论它们是否是交互式的。这有时很有用,因为它允许您为非交互式 ssh 会话设置环境变量,但这与交互式设置(提示、键绑定、别名等)完全不同。一般来说,.bashrc可以是两个不相关的部分:

if [ -t 1 ]; then
  # Stuff for interactive bash shells (defined here as shells running in a terminal).
  # Prompt, key bindings, aliases, terminal settings, …
  # It's ok to print things to the terminal here (e.g. to set the terminal title).
else
  # Environment variables for ssh sessions.
  # Do not print anything here.
fi

旁注:对于交互式 ssh 登录,如果 bash 是您的登录 shell,它会读取.bash_profile但不是.bashrc.您需要.bashrc在您的源中获取源代码.bash_profile(如果 shell 是交互式的)。

答案2

请忽略。 .bashrc 中的某些内容导致了问题。我没有看到这一点,因为 SSH 进入时它没有执行。

相关内容