当我与远程计算机建立 SSH 连接时,我需要将文件从本地计算机 (unix) 传输(复制)到远程计算机主机 (linux)。
使用 SSH 连接后,在与远程主机的相同 SSH 连接下,我应使用终端中的什么命令将文件从本地计算机传输(复制/同步)到该远程主机?
我知道“scp”、“sftp”和“rsync”文件传输,但这些是在 SSH 连接之外使用的,独立正确吗?...所以,我希望能够运行复制文件的命令在安全的 SSH 连接下。
我可以在运行的 SSH 连接下使用 'scp'、'sftp'、'ftp' 或 'rsync' 命令吗?如果可以,如何操作?
谢谢!
最佳答案
更新:这可能是您真正想知道的答案:https://askubuntu.com/questions/13382/download-a-file-over-an-active-ssh-session/13586#13586
scp、sftp 等创建自己的 SSH 连接,除非它们通过已打开的某个端口进行隧道传输。任何时候从命令行运行它们都是如此,无论该命令行是否是现有 SSH session 的一部分。隧道数据效率低下,并且并不比独立的 SSH 连接更安全,除非您尝试在服务器之间中继以隐藏您自己的地址。
要执行您想要的操作,您需要将本地计算机设置为允许 SSH 访问。然后,您可以简单地执行“scp -P 4321 yourUserName@yourlocalhostsexternalhostname:path/to/file.txt ./”之类的操作,以便在登录服务器的同时将文件复制到您的服务器。
一直输入该命令很痛苦,我更喜欢在本地 Unix 计算机上的命令行中工作,并将当前工作目录同步到它所属的服务器上的任何位置。我包括了我的程序来执行此操作(它仅设计用于当您将成为运行它的人时 - 有很多不安全的线路过于信任用户的输入)。
这个程序非常容易使用,多年来我从未使用过任何其他东西将我在本地计算机上处理的文件传输到我的实时网络服务器。当我为别人工作时,我总是怀念这个项目。
为了使用该程序,您必须在当前目录或任何父目录中创建一个文件“.root”。 “.root”文件指定根目录在服务器上的所属位置。这样,我的程序就可以准确找到该根目录的任何子目录所属的位置。它大大提高了 rsync 的效率,因为它不是通过我的整个网站进行 rsync,而是简单地 rsync 我当时正在处理的网站部分。
#!/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
<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="6805110609050d281b0d1a1e0d1a46060d1c" rel="noreferrer noopener nofollow">[email protected]</a>:www
带有额外标志的“.root”文件示例:
$ cat .root
-e 'ssh -p 4321 -C' <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="0871677d7a6669656d4860677b7c3a3c3e302660677b7c60677b7c60677b7c266b6765" rel="noreferrer noopener nofollow">[email protected]</a>:www
一旦“cpwd”程序位于您的路径中并且“.root”文件在当前或父目录中的某个位置创建,您所需要做的就是在您的网站上工作并转到命令行(Ctrl-Z我想到了)并输入
$ cpwd
以便将工作目录中的所有内容同步到 .root 文件中指定的网站。
请注意,为了安全起见,cpwd 不会创建多于一层的不存在目录,以防万一您弄乱了“.root”文件并尝试意外地将整个网站复制到网络服务器的子目录中。
关于ssh - 通过 SSH 连接传输文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15628417/