我想在运行 Ubuntu 10.04 LTS 的 Linode VPS 上使用基于 SSH 的 Git。
说明看起来很简单,事实上,考虑到我已经设置了 SSH 密钥等。
我所要做的就是指示我的本地存储库发送到服务器
ssh://[email protected]:22/~/mygits/proj1.git
问题是,当我git push origin master
这样做时,它只是停顿,没有网络活动,没有错误,几分钟后我用 Ctrl-C 杀死它。我昨天派人去尝试诊断问题。因此,在服务器上,我设置了一个新用户matt2
并复制authorized_keys
到matt2
并尝试推送到中提琴[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 进入时它没有执行。