SCP无法正常工作,但SSH可以


56

如果我想通过scp向服务器发送消息:

$ scp file server:
                   _____  _____  _____
$

,然后打印三行,并且不复制文件。但是我可以通过ssh毫无问题地连接到服务器:

$ ssh server

如何使SCP工作?


提供更多的信息,如操作系统,SSH配置文件等等
qroberts

这三行打印的是什么?
jjlin 2012年

在正常情况下,当您运行时scp file server:(假设“服务器”是有效的主机名),该文件将被复制到您的帐户目录中。
dan_linder 2012年

3
运行“ scp -v文件服务器:”时,能否提供输出?
dan_linder 2012年

您可能会尝试scp在服务器上的其他位置,然后尝试一个cpmv之后的位置ssh
Jesse W. Collins

Answers:


68

此类行为的一个可能原因是在服务器上的登录过程中打印了任何消息。Scp依靠ssh在客户端和服务器之间提供完全透明的加密隧道。

检查服务器上的所有登录脚本,并尝试使用其他用户。识别错误源的另一种方法是在命令中使用-v来跟踪事务的进度,并查看失败的地方。如有必要,最多可以使用-vvv来增加详细程度。正如InChargeOfIT在帖子中列出的那样,检查各种形式的scp也是有启发性的。

scp在后台使用ssh设置了一个隧道,然后在该隧道上传输文件,并在远端使用ssh命令在文件通过时捕获该文件。使用tar和ssh复制目录结构以保留所有权和创建时间的示例如下所示:

  tar czf - ./* | ssh jf@otherserver.com tar xzf - -C ~/saved_tree

发送过来,并且

ssh jf@otherserver.com "tar czf - ~/saved_tree" | tar xzvf - -C ./

找回来


这真的很有帮助
Maple

是否可以在.bashrc中检测scp?这样,您可以在外壳不是scp的情况下检查并仅打印输出?
亚历山德罗斯

用户还需要具有特权级别15。如果用户不是特权级别15,则ASA只会在身份验证后关闭连接,而不会显示指示特权问题的错误消息。另外,仅因为您的用户可以键入enable并输入密码并不意味着他们的权限是priv15。如果您在其中某处看不到“ privilege 15”,show run | inc USERNAME则他们将无法scp。
泰勒·艾拜尔

我基本上从远程服务器上的.bashrc中删除了“ zsh”,并且scp开始工作!
极客

如果您在中更改SHELL变量(例如export SHELL=/bin/zsh),它也会中断~/.bashrc。有时在没有时使用chsh
Suuuehgi

57

检查目标用户的.bashrc或等效文件。〜/ .bashrc用于非交互式登录。如果有回显或命令输出任何内容,它将破坏SCP协议。


10
EUREKA!这是我的问题,因为我发了财。在我的远程.bashrc中的每次登录时都可以选择 现在工作正常。
托马斯·布朗

3
主席先生,是一位救生员。:)
Gaurav Manchanda '16

4
如果仍然需要fortune | cowsay,只需将其放在.bash_profile中。这仅用于交互式登录,不应在SCP会话期间获取。
spoulson '16

我的问题是我.bashrc要在另一个计算机上不存在另一个文件。您可以使用此答案中的逻辑在~/.bashrc非交互式时跳过(这是的情况scp)。
wisbucky

15

编辑:您是否肯定要在scp命令中输入有效路径?例如:

scp test.txt username@remoteserver.com

将会失败(实际上,它只会像您看到的那样打印出命令)。在这种情况下,您将需要提供到远程服务器的有效路径。例如,scp test.txt username@remoteserver.com:~/

用法示例:

发送文件:

scp /path/to/local/file yourremoteusername@servername.com:/path/to/remote/directory

获取文件:

scp yourremoteusername@servername.com:/path/to/remote/file /path/to/local/directory

例子:

将文件从我的桌面发送到远程服务器上的主文件夹:

scp ~/Desktop/myfile.txt john_doe@10.1.1.10:~/

请记住,这~是您的主目录的快捷方式...例如,/ home /

将文件发送到webroot:

scp ~/Documents/working/index.html john_doe@johndoe.com:/var/www/index.html

在此示例中,用户john_doe将需要在远程/ var / www目录上具有写权限。


2
您没有回答问题。OP给出的命令行看起来还不错,有趣的是------……您的示例均与此无关。
akira

@akira也许,也许不是。不提供有效路径将导致scp命令失败。例如,scp somefile user@host.com:此外,对远程目录没有正确的权限也将导致问题。编辑了我的答案以使其更加清晰
InChargeOfIT 2012年

1
您的示例都没有涵盖“文件不存在”,您的示例都没有涵盖“服务器端权限错误” ...
akira

4

在某些主机上,它们错误地.bash_profile获取了非交互式登录信息,例如scp。打印到终端的消息可能导致scp其无法正常运行。如果您有消息,.bash_profile这可能是原因。

为了使您的登录消息,横幅等仍然显示在交互式登录上,并且仍然能够scp通过非交互式登录使用,请在.bash_profile文件中打印出的任何消息之前添加以下内容。

# ********** If not running interactively, don't do anything more! ***********

[ -z "$PS1" ] && return

备用代码是:

[[ $- == *i* ]] || return

还有另一个替代代码:

case $- in
    *i*) ;;
      *) return;;
esac

我相信这是第一个备用代码的较长版本。我发现在某些主机上,第一个代码无法正常工作,但是第二个可以。

在非交互式scp登录期间,它将中止.bash_profile的进一步执行并允许scp工作,但在通过ssh登录时将显示您的登录消息。

注意:.bashrc如果从.bash_profile($ PATH)中获取文件,也可以在文件中使用它,因此在非交互式登录期间仅获取文件的一部分。


谢谢像魅力一样工作........
某物

0

这不能直接回答问题,但是对于像我这样的人可能会有所帮助,在2个远程主机之间传输文件时,使用冻结的scp寻找解决方案。

如果scp由于ssh消息而挂起,则可以抑制它们:

scp -o "StrictHostKeyChecking no"

和/或

scp -B

来自scp的人:

-B选择批处理模式(防止要求输入密码或口令)。

-o ssh_option可用于以没有单独的scp命令行标志的格式将选项传递给ssh。有关下面列出的选项及其可能值的完整详细信息,请参见ssh_config(5)。

就我而言,这似乎有所帮助,但并不能解决整个问题。我们无法找出从远程到远程传输时scp挂起的原因。它挂在文件中间。它工作了9次,但尝试10次却没有。我们怀疑当我们的VPN连接暂时出现流量高峰然后scp无法恢复时,它可能会挂起。它实际上只是永久挂起,甚至不发出错误消息。

但是,我放弃了,改用sftp。这相当快,因为​​它使用远程主机之间的直接连接。您必须启用

Host example.com
    AgentForward yes

在运行脚本的计算机的〜/ .shh / config文件中。当然,仅当远程计算机都在您信任的网络中时,这才是解决方案。


0

我打电话exec /bin/bash.cshrc

删除此问题为我解决了问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.