ssh - 通过 SSH 连接传输文件

标签 ssh terminal file-transfer

当我与远程计算机建立 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/

相关文章:

java - 使用java传输文件

ssh - 如何生成无需密码即可登录服务器的 ssh key

wordpress - SSH 与 virtualbox,如何?

尽管我可以 ssh 进入 github,但 git clone 给出的权限被拒绝

php - phpunit目录错误?

ubuntu - 如何更改 oh my zsh 中的提示并向其中添加主机名?

ruby-on-rails-3 - 部署时使用 capistrano 3 时遇到问题

python - 如何在 Python 的 curses 中获得更多颜色?

android - 通过蓝牙传输文件失败

Android 应用程序使用 Smack 和 Openfire 4.1.4 发送图像时出错