为 GIT_SSH_COMMAND 指定多个命令
Posted
技术标签:
【中文标题】为 GIT_SSH_COMMAND 指定多个命令【英文标题】:Specifying multiple commands for GIT_SSH_COMMAND 【发布时间】:2022-01-07 04:32:24 【问题描述】:背景
我在工作中使用的大多数系统只能在公司 LAN 或 *** 上使用。在连接到这些网络时,我的连接通过代理,该代理受 HTTP 基本授权保护。
但是,我的一个项目要求我使用 SSH 密钥连接到 GitHub。在公司网络/*** 之外(即没有代理),这一切都设置好并且工作正常,但我也一直在尝试让它在该网络内工作,因为我不想保留断开并重新连接 *** 以访问前面提到的其他受保护系统。我已经非常接近了。
许多文章和 SO 答案都鼓励在我的 .ssh/config
中为 github.com 添加一个条目,并将 ProxyCommand
选项与 nc
或 corkscrew
等内容一起使用。但是这些似乎都不能很好地满足我的代理对身份验证的要求。 已经工作的一个工具是desproxy
。
我可以使用以下 ssh 配置成功连接到 *** 后面的 GitHub 存储库:
Host github.com
IdentityFile <key>
HostName 127.0.0.1
Port 2222
然后运行以下命令:
set PROXY_USER=$proxy_user:$proxy_pw
desproxy ssh.github.com 443 $proxy_host $proxy_port 2222 &
git clone git@github.com:<user>/<repo>.git
问题
现在,每当我使用 SSH 克隆时,我想要某种方式来运行这些命令。我不想要git
的别名,因为这样desproxy
将在我每次运行 git 命令时启动——它应该只在使用基于 SSH 的远程的 repo 上运行 git clone|fetch|push|etc
时启动。据我了解,这就是GIT_SSH_COMMAND
环境变量或core.sshCommand
git 配置变量的目的。
我遇到困难的地方 - 我有多个命令需要在 ssh
之前运行,所以我希望我的配置如下所示:
# environment variable
export GIT_SSH_COMMAND="set PROXY_USER=$proxy_user:$proxy_pw; desproxy ssh.github.com 443 $proxy_host $proxy_port 2222 &; ssh"
# git configuration variable (using '\;' instead of ';' as that is used for comments in git configuration file)
[core]
sshCommand = set PROXY_USER=$proxy_user:$proxy_pw\; desproxy ssh.github.com 443 $proxy_host $proxy_port 2222 &\; ssh
但是这两种方法都失败了
# environment variable
❯ git clone git@github.com:<user>/<repo>.git
Cloning into '<repo>'...
set PROXY_USER=$proxy_user:$proxy_pw; desproxy ssh.github.com 443 $proxy_host $proxy_port 2222 &; ssh: 1: Syntax error: ";" unexpected
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
# git configuration variable
❯ git clone git@github.com:<user>/<repo>.git
fatal: bad config line 6 in file /home/murchu27/.gitconfig
那么,GIT_SSH_COMMAND
使用多个命令的正确方法是什么?
更新
我尝试了@phd 的建议,即在我的GIT_SSH_COMMAND
中省略与号后的分号;即,使用以下内容:
export GIT_SSH_COMMAND="set PROXY_USER=$proxy_user:$proxy_pw; desproxy ssh.github.com 443 $proxy_host $proxy_port 2222 & ssh"
但是,我现在收到一个新错误:
❯ git clone git@github.com:<user>/<repo>.git
Cloning into '<repo>'...
bind: Address already in use
fatal: protocol error: bad line length character:
---
Pseudo-terminal will not be allocated because stdin is not a terminal.
ssh: Could not resolve hostname PROXY_USER=<proxy_user>:<proxy_pw>: Name or service not known
更新 2
我接受了@phd 的回答,因为它确实回答了这个问题,即使它没有解决我的具体问题。我编写了一个帮助脚本来使其正常工作,稍后我将发布。
【问题讨论】:
作为一般规则,如果您有一些复杂(如果需要,启动代理,如果合适,使用现有代理等),您可能应该编写一个脚本来执行此操作,并且然后设置 GIT_SSH_COMMAND 来运行你的脚本。您可以通过在您控制的条件下手动运行脚本来单独调试脚本。 【参考方案1】:语法错误:“;”出乎意料
错误来自 shell。完全省略分号,&
本身就是一个命令分隔符:
export GIT_SSH_COMMAND="set PROXY_USER=$proxy_user:$proxy_pw; desproxy ssh.github.com 443 $proxy_host $proxy_port 2222 & ssh"
【讨论】:
感谢您的回答,不幸的是它没有对问题进行排序。我已根据您的建议结果更新了问题 "bind: Address already in use" 你已经运行了desproxy
,它不能在同一个端口上第二次启动。 "fatal: protocol error: bad line length character:" 这是server-side error;在你的情况下,它可能是代理错误。
我在杀死desproxy
并运行git clone
后得到了那个错误,所以我不确定它是否就这么简单。 GIT_SSH_COMMAND
在获取期间是否多次运行?另外,如果desproxy
启动失败,是不是还不能正常运行ssh
?
我对@987654330@一无所知,你自己来吧。以上是关于为 GIT_SSH_COMMAND 指定多个命令的主要内容,如果未能解决你的问题,请参考以下文章
用dos的copy或xcopy命令是否可以实现一次拷贝多个指定文件?