在Windows上使用PuTTY进行git推送失败(致命:远程端意外挂断)

发布于 2024-11-19 15:36:46 字数 8687 浏览 4 评论 0原文

由于准备好进行第一次 git Push,我很兴奋,在我的 cygwin 环境中为 PuTTY 创建了一个别名:

alias ssh="/cygdrive/c/PROGRA~2/putty/PUTTY.EXE"

然后调用(当然,在我的工作目录中),只需正如git 社区书籍第 47 页所述:

git push ssh://mylinuxserver/~winwin/gitrepo master:master

我的兴奋并没有持续很长时间,因为它立即失败并出现致命错误:

error: cannot run ssh: No such file or directory
fatal: unable to fork

考虑到我能够成功运行,从相同的命令行和 shell 实例ssh winwin@mylinuxserver 我很惊讶收到此错误消息。

知道为什么会发生这种情况以及如何解决这个问题吗?

更新一:感谢本指南,我发现 PUTTY .EXE 不是在 git 中使用的正确 exe。相反,应该使用PLINK.EXE

该指南还暗示应该使用名为 GIT_SSH 的环境变量来让 git 知道如何发挥作用。所以,我:

~/sb/ws> export GIT_SSH=/cygdrive/c/PROGRA~2/putty/PLINK.EXE
~/sb/ws> git push ssh://mylinuxserver/~winwin/gitrepo master:master

现在我收到了一个不同的错误:

fatal: The remote end hung up unexpectedly

我认为这个进展是在正确的方向上,但我仍然不知道如何解决问题。任何想法将不胜感激。

更新二:仍在尝试解决这个谜团。这次我怀疑,由于 git push 不会在任何地方提示输入用户名+密码,身份验证必须位于密钥内......因此,我仔细检查了 sshd 配置此操作方法。我发现唯一需要更改的是取消注释 /etc/ssh/sshd_config 中的 HostKey /etc/ssh/ssh_host_dsa_key 行并重新启动服务 service sshd restart。此后第一次,$GIT_SSH 确实提示确认服务器的 dss 密钥指纹,并且我确认将密钥存储在缓存中,但是......问题仍然存在:

fatal: The remote end hung up unexpectedly

其他想法?

(PuTTY 的注册表现在包含同一服务器的两个密钥:rsa2@22:mylinuxserverdss@22:mylinuxserver。嗯...我不确定这意味着什么)

更多诊断信息:输入$GIT_SSH -v 得到:

~/sb/ws> $GIT_SSH -v
Looking up host "mylinuxserver"
Connecting to 192.168.1.2 port 22
Server version: SSH-2.0-OpenSSH_4.2
We claim version: SSH-2.0-PuTTY_Release_0.60
Using SSH protocol version 2
Doing Diffie-Hellman group exchange
Doing Diffie-Hellman key exchange with hash SHA-1
Host key fingerprint is:
ssh-dss 1024 c8:77:42:4f:76:29:56:4c:ea:b0:11:6a:a6:3c:6a:f7
Initialised AES-256 SDCTR client->server encryption
Initialised HMAC-SHA1 client->server MAC algorithm
Initialised AES-256 SDCTR server->client encryption
Initialised HMAC-SHA1 server->client MAC algorithm
login as: winwin
winwin@mylinuxserver's password:
Sent password
Access granted
Opened channel for session
Allocated pty (ospeed 38400bps, ispeed 38400bps)
Started a shell/command
Last login: Wed Jul 13 21:41:12 2011 from winmachine

你能发现任何可疑的东西吗?

到达那里:到目前为止,适合我的情况的最佳指南:Git、SSH、PuTTY

见解:

  1. 就必须运行 $GIT_SSH -agent
  2. 一旦PAGEANT.EXE 必须在后台运行(并且私钥通过其系统托盘图标添加到其中!),
  3. !) PUTTYGEN.EXE 必须用于生成公钥/私钥对
  4. dss 不是强制性的,rsa 就足够了。
  5. 更多? (除非 $GIT_SSH -2 -C -i C:\\Users\\winwin\\SSH\\private.ppk 在没有密码提示的情况下成功,否则尝试 git push 是没有意义的...)

复制后将 PuTTY 密钥生成器中的公钥粘贴到 mylinuxserver 中的 /home/winwin/.ssh/authorized_keys 时,会显示一条新消息来响应上面见解 #5 中的命令:

Server refused our key

这是一个好兆头...:)我想我正在解开这个谜团。

更新 III: 在 sshd 服务器上的 /etc/ssh/sshd_config 中将 StrictModes 更改为 no 后,我管理了使用 $GIT_SSH -2 -C -i C:\\Users\\winwin\\SSH\\private.ppk 成功。但它仍然提示输入用户名(但不提示输入密码)。

然而 git push ssh://mylinuxserver/~winwin/gitrepo master:master 仍然失败 - 并显示相同的错误消息:

fatal: The remote end hung up unexpectedly

这太疯狂了。

更新 IV: PLINK 的 -l username 参数是关键。通过创建 1 行 shell 脚本 /cygdrive/c/PROGRA~2/putty/PLINK.EXE -l winwin $*,我成功地使 git Push 登录成功并将整个脚本的路径导出到$GIT_SSH,但“远程端仍然意外挂起”。

这是我在客户端(Windows/PuTTY)端得到的结果:

~/sb/ws> git push ssh://mylinuxserver/~winwin/gitrepo master:master
Environment:
  USER=winwin
  LOGNAME=winwin
  HOME=/home/winwin
  PATH=/usr/local/bin:/bin:/usr/bin
  MAIL=/var/mail/winwin
  SHELL=/bin/bash
  SSH_CLIENT=192.168.1.8 50951 22
  SSH_CONNECTION=192.168.1.8 50951 192.168.14.2 22
bash: mylinuxserver: command not found
fatal: The remote end hung up unexpectedly

这是我在服务器端(Linux/sshd)端得到的结果:

debug1: sshd version OpenSSH_4.2p1
debug1: read PEM private key done: type RSA
debug1: private host key: #0 type 1 RSA
debug1: read PEM private key done: type DSA
debug1: private host key: #1 type 2 DSA
debug1: rexec_argv[0]='/usr/sbin/sshd'
debug1: rexec_argv[1]='-d'
debug1: Bind to port 22 on ::.
Server listening on :: port 22.
debug1: Bind to port 22 on 0.0.0.0.
Bind to port 22 on 0.0.0.0 failed: Address already in use.
debug1: Server will not fork when running in debugging mode.
debug1: rexec start in 4 out 4 newsock 4 pipe -1 sock 7
debug1: inetd sockets after dupping: 3, 3
Connection from 192.168.1.8 port 50951
debug1: Client protocol version 2.0; client software version PuTTY_Release_0.60
debug1: no match: PuTTY_Release_0.60
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_4.2
debug1: permanently_set_uid: 74/74
debug1: list_hostkey_types: ssh-rsa,ssh-dss
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: client->server aes256-ctr hmac-sha1 none
debug1: kex: server->client aes256-ctr hmac-sha1 none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST_OLD received
debug1: SSH2_MSG_KEX_DH_GEX_GROUP sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_INIT
debug1: SSH2_MSG_KEX_DH_GEX_REPLY sent
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: KEX done

debug1: userauth-request for user winwin service ssh-connection method none
debug1: attempt 0 failures 0
debug1: PAM: initializing for "winwin"
debug1: PAM: setting PAM_RHOST to "win7client"
debug1: PAM: setting PAM_TTY to "ssh"
Failed none for winwin from 192.168.1.8 port 50951 ssh2
debug1: userauth-request for user winwin service ssh-connection method publickey
debug1: attempt 1 failures 1
debug1: test whether pkalg/pkblob are acceptable
debug1: temporarily_use_uid: 513/513 (e=0/0)
debug1: trying public key file /home/winwin/.ssh/authorized_keys
debug1: matching key found: file /home/winwin/.ssh/authorized_keys, line 1
Found matching RSA key: bd:a6:4a:6a:04:43:8d:60:d9:bf:66:de:51:13:83:66
debug1: restore_uid: 0/0
Postponed publickey for winwin from 192.168.1.8 port 50951 ssh2
debug1: userauth-request for user winwin service ssh-connection method publickey
debug1: attempt 2 failures 1
debug1: temporarily_use_uid: 513/513 (e=0/0)
debug1: trying public key file /home/winwin/.ssh/authorized_keys
debug1: matching key found: file /home/winwin/.ssh/authorized_keys, line 1
Found matching RSA key: bd:a6:4a:6a:04:43:8d:60:d9:bf:66:de:51:13:83:66
debug1: restore_uid: 0/0
debug1: ssh_rsa_verify: signature correct
debug1: do_pam_account: called
Accepted publickey for winwin from 192.168.1.8 port 50951 ssh2
debug1: monitor_child_preauth: winwin has been authenticated by privileged process
Accepted publickey for winwin from 192.168.1.8 port 50951 ssh2
debug1: PAM: reinitializing credentials
debug1: permanently_set_uid: 513/513
debug1: Entering interactive session for SSH2.
debug1: server_init_dispatch_20
debug1: server_input_channel_open: ctype session rchan 256 win 16384 max 16384
debug1: input_session_request
debug1: channel 0: new [server-session]
debug1: session_new: init
debug1: session_new: session 0
debug1: session_open: channel 0
debug1: session_open: session 0: link with channel 0
debug1: server_input_channel_open: confirm session
debug1: server_input_channel_req: channel 0 request exec reply 1
debug1: session_by_channel: session 0 channel 0
debug1: session_input_channel_req: session 0 req exec
debug1: Received SIGCHLD.
debug1: session_by_pid: pid 3441
debug1: session_exit_message: session 0 channel 0 pid 3441
debug1: session_exit_message: release channel 0
debug1: session_close: session 0 pid 3441
debug1: channel 0: free: server-session, nchannels 1

Connection closed by 192.168.1.8
debug1: do_cleanup
debug1: PAM: cleanup
Closing connection to 192.168.1.8
debug1: PAM: cleanup

需要最后一条线索...

  1. bash: mylinuxserver: 命令是什么未找到 是什么意思?
  2. git push 正在尝试运行什么?
  3. 哪个命令?
  4. 在客户端还是 SSH 服务器上?

Excited about being ready to do my first git push ever, I created an alias for PuTTY in my cygwin environment:

alias ssh="/cygdrive/c/PROGRA~2/putty/PUTTY.EXE"

Then invoked (inside my working directory, of course), just as explained in page 47 in the git community book:

git push ssh://mylinuxserver/~winwin/gitrepo master:master

My excitement didn't last very long, as it immediately failed with a fatal error:

error: cannot run ssh: No such file or directory
fatal: unable to fork

Considering that I am able to run successfully, from the same exact command line and shell instance, ssh winwin@mylinuxserver I am very surprised to receive this error message.

Any idea why this is happening and how to fix this?

UPDATE I: Thanks to this guide, I discovered that PUTTY.EXE is not the correct exe to use in git. Instead, one should be using PLINK.EXE.

That guide also hints that an environment variable, named GIT_SSH, should be used to let git know how to do the magic. So, I:

~/sb/ws> export GIT_SSH=/cygdrive/c/PROGRA~2/putty/PLINK.EXE
~/sb/ws> git push ssh://mylinuxserver/~winwin/gitrepo master:master

And now I am receiving a different error:

fatal: The remote end hung up unexpectedly

I consider this progress in the right direction but I still don't know how to solve the problem. Any idea would be very appreciated.

UPDATE II: Still trying to troubleshoot this mystery. This time I suspected that since git push doesn't prompt for username+password anywhere, authentication must lie within the keys... So, I double-checked sshd configuration per this howto. The only thing I found as needing change was uncommenting the line HostKey /etc/ssh/ssh_host_dsa_key in /etc/ssh/sshd_config and restarting the service service sshd restart. The first time after that, $GIT_SSH did prompt for confirming the server's dss key fingerprint and I confirmed storing the key in cache, but... The problem still persists:

fatal: The remote end hung up unexpectedly

Additional ideas?

(PuTTY's registry now contain two keys for the same server: rsa2@22:mylinuxserver and dss@22:mylinuxserver. Hmmm... I am not sure what this means)

More diagnostic info: Typing $GIT_SSH -v yields:

~/sb/ws> $GIT_SSH -v
Looking up host "mylinuxserver"
Connecting to 192.168.1.2 port 22
Server version: SSH-2.0-OpenSSH_4.2
We claim version: SSH-2.0-PuTTY_Release_0.60
Using SSH protocol version 2
Doing Diffie-Hellman group exchange
Doing Diffie-Hellman key exchange with hash SHA-1
Host key fingerprint is:
ssh-dss 1024 c8:77:42:4f:76:29:56:4c:ea:b0:11:6a:a6:3c:6a:f7
Initialised AES-256 SDCTR client->server encryption
Initialised HMAC-SHA1 client->server MAC algorithm
Initialised AES-256 SDCTR server->client encryption
Initialised HMAC-SHA1 server->client MAC algorithm
login as: winwin
winwin@mylinuxserver's password:
Sent password
Access granted
Opened channel for session
Allocated pty (ospeed 38400bps, ispeed 38400bps)
Started a shell/command
Last login: Wed Jul 13 21:41:12 2011 from winmachine

Can you spot anything suspicious?

Getting there: By far the best guide for my situation: Git, SSH, PuTTY.

Insights:

  1. $GIT_SSH -agent must be run once
  2. PAGEANT.EXE must be running in the background (and private key added to it via its systray icon!)
  3. PUTTYGEN.EXE must be used to generate a public/private keys pair
  4. dss not mandatory, rsa is good enough.
  5. More? (unless $GIT_SSH -2 -C -i C:\\Users\\winwin\\SSH\\private.ppk succeeds without password prompt, there is no point to even try git push...)

After copying & pasting the public key from PuTTY Key Generator to /home/winwin/.ssh/authorized_keys in mylinuxserver a new message showed up in response to the command in insight #5 above:

Server refused our key

This is a good sign... :) I think I am on my way to solving the mystery.

UPDATE III: After changing StrictModes to no in /etc/ssh/sshd_config on the sshd server, I managed to succeed with $GIT_SSH -2 -C -i C:\\Users\\winwin\\SSH\\private.ppk. It still prompts for the username, though (but doesn't prompt for password).

git push ssh://mylinuxserver/~winwin/gitrepo master:master continues to fail however -- with the same error message:

fatal: The remote end hung up unexpectedly

This is insane.

UPDATE IV: The -l username parameter to PLINK is key. I managed to make git push login successfully, by creating a 1-line shell script /cygdrive/c/PROGRA~2/putty/PLINK.EXE -l winwin $* and exporting the the entire script's path to $GIT_SSH, but "the remote end still hangs up unexpectedly".

This is what I am getting on the client (Windows/PuTTY) side:

~/sb/ws> git push ssh://mylinuxserver/~winwin/gitrepo master:master
Environment:
  USER=winwin
  LOGNAME=winwin
  HOME=/home/winwin
  PATH=/usr/local/bin:/bin:/usr/bin
  MAIL=/var/mail/winwin
  SHELL=/bin/bash
  SSH_CLIENT=192.168.1.8 50951 22
  SSH_CONNECTION=192.168.1.8 50951 192.168.14.2 22
bash: mylinuxserver: command not found
fatal: The remote end hung up unexpectedly

And This is what I am getting on the server side (Linux/sshd) side:

debug1: sshd version OpenSSH_4.2p1
debug1: read PEM private key done: type RSA
debug1: private host key: #0 type 1 RSA
debug1: read PEM private key done: type DSA
debug1: private host key: #1 type 2 DSA
debug1: rexec_argv[0]='/usr/sbin/sshd'
debug1: rexec_argv[1]='-d'
debug1: Bind to port 22 on ::.
Server listening on :: port 22.
debug1: Bind to port 22 on 0.0.0.0.
Bind to port 22 on 0.0.0.0 failed: Address already in use.
debug1: Server will not fork when running in debugging mode.
debug1: rexec start in 4 out 4 newsock 4 pipe -1 sock 7
debug1: inetd sockets after dupping: 3, 3
Connection from 192.168.1.8 port 50951
debug1: Client protocol version 2.0; client software version PuTTY_Release_0.60
debug1: no match: PuTTY_Release_0.60
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_4.2
debug1: permanently_set_uid: 74/74
debug1: list_hostkey_types: ssh-rsa,ssh-dss
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: client->server aes256-ctr hmac-sha1 none
debug1: kex: server->client aes256-ctr hmac-sha1 none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST_OLD received
debug1: SSH2_MSG_KEX_DH_GEX_GROUP sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_INIT
debug1: SSH2_MSG_KEX_DH_GEX_REPLY sent
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: KEX done

debug1: userauth-request for user winwin service ssh-connection method none
debug1: attempt 0 failures 0
debug1: PAM: initializing for "winwin"
debug1: PAM: setting PAM_RHOST to "win7client"
debug1: PAM: setting PAM_TTY to "ssh"
Failed none for winwin from 192.168.1.8 port 50951 ssh2
debug1: userauth-request for user winwin service ssh-connection method publickey
debug1: attempt 1 failures 1
debug1: test whether pkalg/pkblob are acceptable
debug1: temporarily_use_uid: 513/513 (e=0/0)
debug1: trying public key file /home/winwin/.ssh/authorized_keys
debug1: matching key found: file /home/winwin/.ssh/authorized_keys, line 1
Found matching RSA key: bd:a6:4a:6a:04:43:8d:60:d9:bf:66:de:51:13:83:66
debug1: restore_uid: 0/0
Postponed publickey for winwin from 192.168.1.8 port 50951 ssh2
debug1: userauth-request for user winwin service ssh-connection method publickey
debug1: attempt 2 failures 1
debug1: temporarily_use_uid: 513/513 (e=0/0)
debug1: trying public key file /home/winwin/.ssh/authorized_keys
debug1: matching key found: file /home/winwin/.ssh/authorized_keys, line 1
Found matching RSA key: bd:a6:4a:6a:04:43:8d:60:d9:bf:66:de:51:13:83:66
debug1: restore_uid: 0/0
debug1: ssh_rsa_verify: signature correct
debug1: do_pam_account: called
Accepted publickey for winwin from 192.168.1.8 port 50951 ssh2
debug1: monitor_child_preauth: winwin has been authenticated by privileged process
Accepted publickey for winwin from 192.168.1.8 port 50951 ssh2
debug1: PAM: reinitializing credentials
debug1: permanently_set_uid: 513/513
debug1: Entering interactive session for SSH2.
debug1: server_init_dispatch_20
debug1: server_input_channel_open: ctype session rchan 256 win 16384 max 16384
debug1: input_session_request
debug1: channel 0: new [server-session]
debug1: session_new: init
debug1: session_new: session 0
debug1: session_open: channel 0
debug1: session_open: session 0: link with channel 0
debug1: server_input_channel_open: confirm session
debug1: server_input_channel_req: channel 0 request exec reply 1
debug1: session_by_channel: session 0 channel 0
debug1: session_input_channel_req: session 0 req exec
debug1: Received SIGCHLD.
debug1: session_by_pid: pid 3441
debug1: session_exit_message: session 0 channel 0 pid 3441
debug1: session_exit_message: release channel 0
debug1: session_close: session 0 pid 3441
debug1: channel 0: free: server-session, nchannels 1

Connection closed by 192.168.1.8
debug1: do_cleanup
debug1: PAM: cleanup
Closing connection to 192.168.1.8
debug1: PAM: cleanup

Last clue needed...

  1. What does bash: mylinuxserver: command not found mean?
  2. What is git push trying to run?
  3. Which command?
  4. On the client or the SSH server?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

つ可否回来 2024-11-26 15:36:46

使用plink?您可能需要重新创建为 putty 创建的密钥。

http://www.xinotes.org/notes/note/156/

using plink? you might have to recreate the keys which you created for putty.

http://www.xinotes.org/notes/note/156/

梦里南柯 2024-11-26 15:36:46

我觉得通过 Putty 是造成所有这些问题的原因,但不清楚为什么这是必要的 - 如果您使用 cygwin 那么您已经内置了 ssh。

我通过 cygwin 使用 git 而不是 ssh 没有任何问题。也许是更好的路线?是否有加入腻子的原因,或者是某处指南中推荐的内容?

I feel like going through Putty is what's creating all of these issues but it's not clear why that's necessary - if you're using cygwin then you already have ssh built in.

I use git through cygwin over ssh with no issues. Might be a better route? Was there a reason for incorporating putty or was it something that was recommended in a guide somewhere?

夏花。依旧 2024-11-26 15:36:46

我从未成功地使 gitPuTTY 一起工作。我这边进一步的时间投入似乎并不能证明投资回报率是合理的,所以我放弃了。

I never succeeded making git work with PuTTY. Further time investment on my side didn't seem to justify ROI, so I am giving up.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文