2012-02-29 15:44:22 +0000 2012-02-29 15:44:22 +0000
60
60
Advertisement

scp不工作,但ssh可以

Advertisement

如果我想通过scp向服务器发送东西。

$ scp file server:
                   __________  _____
$

,然后打印出三行字,并且没有复制文件。但是我可以通过ssh连接到服务器而没有问题:

$ ssh server

如何使scp工作?

Advertisement
Advertisement

答案 (6)

72
72
72
2012-03-04 02:57:22 +0000

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

检查服务器上所有的登录脚本,也可以尝试使用不同的用户。另一种确定错误来源的方法是使用命令中的-v,来跟踪交易的进度,看看哪里失败了。如果有必要的话,你可以使用到-vvv来增加啰嗦的程度。检查scp的各种形式也可以起到指导作用,InChargeOfIT的帖子中列出了。

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 ./

将其取回。

61
61
61
2014-06-03 18:20:48 +0000

检查目标用户的.bashrc或同等文件。~/.bashrc是非交互式登录的来源。如果有回音或命令输出任何东西,它将破坏SCP协议。

15
Advertisement
15
15
2012-02-29 17:21:01 +0000
Advertisement

编辑: 你确定你在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目录下拥有写权限。

5
5
5
2018-12-02 14:21:35 +0000

在某些主机上,它们错误地将.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($PATH)中获取源码,这也可以用在你的.bash_profile文件中,所以在非交互式登录时,只有部分源码被获取。

0
Advertisement
0
0
2018-10-14 14:34:43 +0000
Advertisement

我在exec /bin/bash中调用.cshrc

去掉这个就解决了我的问题。

0
0
0
2018-10-02 14:01:50 +0000

这并不能直接回答问题,但可能对像我这样的人有帮助,因为他们正在寻找在两个远程主机之间传输文件时冻结scp的解决方案。

如果scp因为来自ssh的消息而挂起,可以帮助压下它们。

scp -o "StrictHostKeyChecking no"

and / or

scp -B

来自scp man:

-B 选择批处理模式(防止询问密码或口令)。

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

在我的例子中,这似乎有帮助,但并没有解决整个问题。我们无法找出为什么scp在从远程传输到远程时挂起。它挂在了文件的中间。9次成功了,第10次没有成功。我们怀疑可能是当我们的VPN连接遇到流量高峰时,scp就会挂掉,然后无法恢复。它真的就是永远挂着,甚至没有给出错误信息。

然而,我放弃了,改用sftp。这个速度相当快,因为它使用远程主机之间的直接连接。你必须在运行脚本的机器的 ~/.shh/config 文件中启用

Host example.com
    AgentForward yes

。当然这只是在远程机器都在你的信任网络内的情况下的解决方案。

Advertisement

相关问题

19
12
16
13
3
Advertisement
Advertisement