不起作用的scp命令:远程主机关闭连接(Mac OS X)

10

我正在通过Mac终端连接远程服务器,自从我将操作系统更新为OSX 10.10后,每次尝试从服务器向我的电脑使用scp命令时都会收到以下提示:

ssh_exchange_identification: Connection closed by remote host
lost connection

如果我反向执行scp(从Mac复制到服务器),它可以正常工作,并且如果我从另一台Mac执行也可以正常工作。

如果我使用详细模式执行scp,它会给我这个:

Executing: program /usr/bin/ssh host xx.xx.xx.x, user User, command scp -v -t /Users/User
OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 Feb 2013
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Applying options for *
debug2: ssh_connect: needpriv 0
debug1: Connecting to xx.xx.xx.x [xx.xx.xx.x] port 22.
debug1: Connection established.
debug1: identity file /home/user/.ssh/identity type -1
debug1: identity file /home/user/.ssh/identity-cert type -1
debug1: identity file /home/user/.ssh/id_rsa type -1
debug1: identity file /home/user/.ssh/id_rsa-cert type -1
debug1: identity file /home/user/.ssh/id_dsa type -1
debug1: identity file /home/user/.ssh/id_dsa-cert type -1
debug1: identity file /home/user/.ssh/id_ecdsa type -1
debug1: identity file /home/user/.ssh/id_ecdsa-cert type -1
ssh_exchange_identification: Connection closed by remote host
lost connection

我尝试查看各种主机、配置和ssh文件,但没有解决太多问题。

服务器是否仅配置了密钥对认证? - trojanfoe
我必须询问管理员,但我真的这么认为。 - gmaster
在这种情况下,我认为问题可能是您没有服务器用户的私钥。 - trojanfoe
但我可以连接到它并执行任何其他操作,这是升级后唯一停止工作的操作。 - gmaster
9个回答

7

我刚刚在将文件从我的个人Mac传输到我们用作本地服务器的Mac桌面电脑时,遇到了同样的问题。运行sudo sshd -t向我展示了以下提示:

/var/empty must be owned by root and not group or world-writable

我所做的只是将所有者更改回root(我不确定为什么它不是root,但我记得从Mavericks升级到Yosemite时权限方面出了一些问题):

cd /var
sudo chown root empty

我希望这能有所帮助。

1
谢谢!那个命令 sudo sshd -t 显示了我遇到的确切问题!(sshd_config 文件中一行缺少 **#**) 问题解决了!!! - gmaster
非常感谢。我的问题和你描述的一样,这个解决方法对我很有帮助。我正在尝试从macOS 10.13 SSH连接到OS X 10.11。 - John C

3

我也遇到了这个问题。

我尝试过 "sudo sshd -t",但似乎没有问题。

然后我检查了我的 "hosts.allow" 和 "hosts.deny",也没有问题。

最后我发现我在命令中使用了'~'路径,如下所示:

scp ~/Downloads/afile root@host2:~/Downloads

我将其更改为以下内容:

scp /home/Downloads/afile root@host2:/home/Downloads

现在它已经生效了。希望这能帮到您。


2

检查目标用户的.bashrc或等效文件。对于非交互式登录,将源代码~/.bashrc。如果有任何输出echo或命令,则会破坏SCP协议。


远程服务器在接受TCP连接后立即中断了连接。OP无法成功启动ssh会话,更不用说登录了。他的远程主目录内容并不重要。 - Kenster
非常好的答案,我已经苦苦挣扎了很长时间。暂时我不得不重命名我的.bash_profile和.bashrc脚本,以便它们不会干扰scp传输,在scp传输完成后,我恢复了这些bash文件。谢谢! - jcarballo

1
"

'sudo sshd -t' 明确显示了哪个配置行无效。注释掉该配置行后,SCP问题得以解决。非常感谢您的回答。

"

0

系统偏好设置面板 → 共享小程序 → 勾选远程登录复选框。这将启用SSH,从而也启用SCP。


0

当我使用scp -P [wrong_custom_port] user@host:/source /destination时,我遇到了相同的错误。

在谷歌上搜索一段时间后,没有找到任何直接的答案,我终于意识到我在远程主机上的ssh连接中使用了不同的自定义端口号。

希望这能帮助有类似问题的人。


0

我会在这个问题上插一嘴。

今天在尝试从我的局域网中的一台电脑将文件传输到我的 MacBook 时,我遇到了这个问题,并被提示了一条漂亮的 STDOUT 消息,这让我有些困扰。

scp: Connection closed

这并没有给我太多的工作材料,添加 -VVVV 也没有显示任何明显的问题,尽管在这种情况下使用 -VVVV 并不是我每天关注的事情(可能会漏掉一些细节)。

话虽如此,上述的 sudo sshd -t 命令却没有向 STDOUT 打印任何东西。

那么,从这里该怎么办呢?幸运的是,我以前遇到过有关 SSH 的问题,并且在我看来,获取关于为什么某个特定的 SSH 相关任务(例如将文件传输到某个 SSH 服务器)失败的一个“合理”的消息的最简单方法就是停止当前正在运行的服务器,并在终端中以前台进程模式启动它以进行调试(如果 SSH 配置文件正确设置的话,可能还可以启动另一个 SSH 服务器以避免停止现有的服务器,但这是我没有深入研究的内容)。对于我的用途而言,停止现有服务器并启动一个新的以调试模式运行的实例非常有效,所以执行以下命令:

sshd -d

在尝试向服务器发送文件时,我看到了STDOUT中的以下行。
debug1: server_input_channel_req: channel 0 request subsystem reply 1
debug1: session_by_channel: session 0 channel 0
debug1: session_input_channel_req: session 0 req subsystem
debug1: subsystem: cannot stat /usr/local/Cellar/openssh/8.8p1/libexec/sftp-server: No such file or directory
debug1: subsystem: exec() /usr/local/Cellar/openssh/8.8p1/libexec/sftp-server
Starting session: subsystem 'sftp' for capin from 10.0.1.42 port 63866 id 0
debug1: Received SIGCHLD.
debug1: session_by_pid: pid 2107
debug1: session_exit_message: session 0 channel 0 pid 2107
debug1: session_exit_message: release channel 0
Received disconnect from 10.0.1.42 port 63866:11: disconnected by user
Disconnected from user capin 10.0.1.42 port 63866
debug1: do_cleanup
debug1: do_cleanup
debug1: PAM: cleanup
debug1: PAM: closing session
debug1: PAM: deleting credentials

这让我觉得那些错误/警告信息是我的问题,并且需要从那里继续进行故障排除。


也许与https://apple.stackexchange.com/questions/451281/unable-to-scp-since-upgrade-to-ventura有关 - undefined

0
添加 -O(字母)
scp -O {文件名} {用户}@{IP}:{路径}
示例: scp -O filename.txt root@192.168.x.x:/usr/home

-1

在服务器和桌面上,用户必须在使用ssh(或scp)之前本地创建密钥。您可以使用以下命令创建强密钥(算法RSA和长度4096):

ssh-keygen -t rsa -b 4096 -C "username"

如果您的服务器上已经有密钥,请检查~/.ssh目录的权限

此处所述,.ssh目录和该目录中的文件的所有者必须是您的用户。.ssh目录的权限必须为700(drwx------),私钥文件的权限必须为600(-rw------),公钥的权限必须为644(-rw-r--r--)。您可以使用以下命令进行检查:

ls -alh

如果不是这种情况,你可以更改它:
   chown -R username ~/.ssh
   chmod 700 ~/.ssh
   chmod 600 ~/.ssh/id_*
   chmod 644 ~/.ssh/*.pub

会话在执行任何类型的密钥交换之前失败。密钥的质量并不重要。 - Kenster
你可以交换密钥,因为你没有密钥。行“debug1:identity file /home/user/.ssh/XXXXXXXX type -1”表示你在客户端机器上没有用于身份验证的密钥文件。因为你没有输入密码的可能性,所以密码识别在服务器上似乎被禁用了。 - Azwaw
但是很奇怪,因为我可以执行任何其他操作(连接、读取、写入、复制服务器等)。这是唯一一个被禁止的操作。 - gmaster
你能在你的 Mac 上执行所有这些操作吗?你的 Mac 上有 sshd 吗? - Azwaw
我使用ssh -X进行连接,是的,除了从服务器到Mac的scp之外,我都可以执行所有操作。 - gmaster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接