通过SSH连接进行文件传输

时间:2013-03-26 02:38:30

标签: ssh terminal file-transfer

当我建立与远程计算机的SSH连接时,我需要将文件从本地计算机(unix)传输(复制)到远程计算机主机(linux)。

使用SSH连接后,在与远程主机的SSH连接完全相同的情况下,我使用终端中的哪个命令从本地计算机将文件传输(复制/同步)到该远程主机?

我知道'scp','sftp'和'rsync'文件传输,但这些是在SSH连接之外使用的,独立正确吗?...所以,我希望能够运行一个复制文件的命令在那个安全的SSH连接下。

我可以在正在运行的SSH连接下使用'scp','sftp','ftp'或'rsync'命令,如果是这样,怎么办?

谢谢!

1 个答案:

答案 0 :(得分:2)

更新:这可能是您实际想要了解的答案:https://askubuntu.com/questions/13382/download-a-file-over-an-active-ssh-session/13586#13586

scp,sftp等,除非通过已经打开的某个端口进行隧道传输,否则创建自己的SSH连接。无论命令行是否是现有SSH会话的一部分,无论何时从命令行运行它们都是如此。隧道数据效率低,并且比独立SSH连接更安全,除非您尝试在服务器之间进行中继以隐藏自己的地址。

要执行您想要的操作,您需要设置本地计算机以允许SSH访问。然后你可以简单地执行诸如“scp -P 4321 yourUserName @ yourlocalhostsexternalhostname:path / to / file.txt ./”之类的操作,以便在您登录服务器的同时将文件复制到服务器。

一直输入该命令是一件痛苦的事情,我更喜欢在我的本地Unix计算机上的命令行中工作,并将当前工作目录同步到它在服务器上的任何位置。我包括我的程序来做这个(它只是为了你将成为运行它的人而设计的 - 有很多不安全的行太过信任用户的输入了。)

这个程序非常容易使用,我从来没有使用过任何其他东西来将我在本地计算机上工作的文件传输到我的实时网络服务器,这已有好几年了。当我为别人工作时,我总是想念这个节目。

要使用此程序,您必须在当前目录或任何父目录中创建“.root”文件。 “.root”文件指定根目录所属的服务器上的位置。这样,我的程序可以准确找到该根目录的任何子目录所属的位置。它大大提高了rsync的效率,因为它不是通过我的整个网站进行rsyncing,它只是简化了我在那一刻工作的网站部分。

#!/usr/bin/perl
# cpwd
# make sure it is in your path
$flagjpeg = "--exclude '*.JPG'";
my $J = shift;
$flagjpeg = "" if $J eq 'JPG';
$n = 10;
$wd = '';
while (! -f '.root') {
$pwd = `pwd | xargs basename`;
chomp $pwd;
$wd = "$pwd/$wd";
chdir('..');
last if $n-- < 1;
}

# chop $wd;

if (! -f '.root') {
    print "No root found!\n";
    exit;
}
$root = `head -1 .root`;
chomp $root;
@cmds = ($root =~ m/(\S+)/g);
$root = pop(@cmds);
$source = "$wd" || './';
$dest = "$root/$source";

print "copy '@cmds' '$source' (to) '$dest'\n";

my $cmd = "(rsync @cmds -vv --max-size=1208KiB $flagjpeg --exclude '*.ezip' --exclude '*.tgz' --exclude '*.gz' -C -avz $source $dest 2>&1) > /tmp/cpwd.log";
chomp(my $mypwd = `pwd`);
my $cmdlarge = "cd '$mypwd'; (rsync @cmds -vv $flagjpeg --exclude '*.ezip' --exclude '*.tgz' --exclude '*.gz' -C -avz $source $dest 2>&1) > /tmp/cpwd.log";

print "$cmd\n$cmdlarge\n\n";

# exit;

system($cmd);

system("grep -e 'over max-size' -e 'sender finished' /tmp/cpwd.log");
system("tail -4 /tmp/cpwd.log | head -3");

“.root”文件的示例:

$ cat .root
myname@server.net:www

带有额外标志的“.root”文件示例:

$ cat .root
 -e 'ssh -p 4321 -C' yourname@host2468.hosthosthost.com:www

一旦“cpwd”程序在你的路径中并且在当前或父目录的某处创建了“.root”文件,你需要做的就是在你的网站上工作并转到命令行(Ctrl-Z想到了)并输入

$ cpwd

为了将工作目录中的所有内容同步到.root文件中指定的网站。

请注意,为了安全起见,cpwd不会创建多个级别的不存在的目录,以防您乱搞“.root”文件并尝试将您的整个网站意外复制到网络服务器的子目录中。