当前位置: 首页 > 科技观察

如何在Linux中使用SCP安全地传输文件

时间:2023-03-19 21:50:40 科技观察

网络上的文件传输可以通过多种不同的方式和协议来完成。远程复制文件最常用的协议是Rsync、SCP和SFTP。在本文中,我们将了解什么是SCP以及如何在Linux和类Unix操作系统中使用SCP在本地和远程计算机之间安全地传输文件。什么是SCP?SCP,全称SecureCopy,是一个命令行程序,可以在Linux和类Unix操作系统中以安全的方式在本地和远程系统之间,或两个远程系统之间复制文件和目录。使用scp命令,您可以安全地复制文件或目录:从本地系统到远程系统从远程系统到本地当使用scp命令在两个远程系统之间传输数据时,文件和目录是加密的。因此,即使网络遭到破坏,作案者也无法获得任何有意义的数据。SCP是openSSH程序的一个组件,它使用SSH协议安全地传输文件。几乎所有现代Linux和Unix发行版都预装了OpenSSH,因此不必费心安装它。警告:根据openSSH开发者的官方声明:scp协议已过时,不灵活且不易修复。我们建议改用更现代的协议,例如sftp和rsync。参考-https://lists.mindrot.org/pipermail/openssh-unix-dev/2019-March/037672.html但是,大多数用户仍然更喜欢SCP协议。因为,SCP处理远程文件传输的速度比其同类SFTP和Rsync快。另外,SCP的工作原理与cp命令完全一样,而rsync会判断源目录是否有尾部斜杠,表现不同。看看以下命令:rsyncsourcedestination/-将源目录复制到目标文件夹中。rsyncsource/destination/-将源目录的内容复制到目标文件夹中。因此,您必须仔细检查是否在路径中添加了斜杠。我个人使用RsyncSCP命令语法SCP的一般语法如下:scp[-346ABCpqrTv][-ccipher][-Fssh_config][-iidentity_file][-Jdestination][-llimit][-ossh_option][-Pport][-Sprogram]source...target根据文件传输路径的不同,语法会有所不同。这里我列出了一些语法格式的例子。将文件从本地复制到远程系统:scpSourceFileUser@RemoteHost:RemotePath同样,使用-r参数将目录从本地系统复制到远程系统:scp-rSourceDirectoryUser@RemoteHost:RemotePath复制多个文件到远程系统:scpSourceFile1SourceFile2User@RemoteHost:RemotePath远程系统复制文件到本地:scpUser@RemoteHost:RemoteFilePathDestinationFile远程系统复制目录到本地:scp-rUser@RemoteHost:RemoteDirectoryPathDestinationDirectory在两个远程系统之间本地复制文件:scpUser@RemoteHost1:RemoteFile1User@RemoteHost2:RemotePath请注意,当您在两个远程系统之间复制文件时,流量不会通过本地系统。操作直接发生在两个远程系统之间。但是,您可以使用-3参数通过运行scp命令的系统路由流量。从本地系统将目录从一个远程系统复制到另一个远程系统:scp-rUser@RemoteHost1:RemoteDirectoryUser@RemoteHost2:DestinationPath。C代表压缩。使用此参数时数据传输速度更快,因为数据已压缩。SCP将自动在源系统上压缩并在目标系统上解压缩。-c:c代表加密密码。默认情况下,SCP使用AES-128加密方法加密数据。您可以使用-c参数更改加密方法。-i:i代表身份文件或私钥。如您所知,SSH中使用基于密码或密钥的身份验证。如果要在传输文件时使用基于密钥的身份验证,可以使用-i参数指定身份文件或私钥。-llimit:l代表限制Limit带宽。通过该参数可以设置传输数据的最大带宽。它的单位是千比特/秒。-F:有时候你可能需要使用不同的网络连接Linux系统,或者你有代理服务器,这种情况下,你可以通过-F参数来使用不同的ssh_config文件。-P端口:P代表端口。请注意,这是一个大写的P。默认情况下,SSH使用端口22。但是出于安全原因,您可能已经更改了目标主机中的端口号。在这种情况下,您应该使用-P参数明确指定新的端口号。-p:如果想保留原Preserve文件的修改时间、访问时间和模式,需要使用-p参数。注意小写的p。-r:Recursively-B:B代表Batch-Sprogram:programforencryptedconnectionsProgram-v:v代表详细Verbose。当使用-v参数时,该命令将在终端屏幕上打印进度。您将确切地看到文件传输时发生的情况。它在调试连接、身份验证和配置问题时很有用。SCP有很多参数,你可以查看它的手册页了解其他参数。让我们看一些有用的scp命令示例。开始之前要记住的重要事项scp命令依赖ssh进行安全文件传输。因此,您必须有一个ssh密钥或密码来验证远程系统。为了能够传输文件,您必须具有对源文件的读取权限和对目标位置的写入权限。scp命令在写入前不检查目标位置。目标位置中具有相同名称的任何文件都将被覆盖,恕不另行通知。为了能够区分本地和远程位置,使用冒号(:)。传输大文件时,推荐使用screen中的scp或者linux中的tmux传输文件正如我所说,我们可以使用scp命令将文件或目录从本地复制到远程系统,反之亦然,或者在两个远程系统之间复制文件或目录。1.使用SCP将文件从本地系统复制到远程系统要使用scp命令将文件从本地系统复制到远程系统,请运行:$scpFile1.txtostechnix@192.168.1.40:/home/ostechnix/示例输出:ostechnix@192.168。1.40的密码:File1.txt100%104814.0KB/s00:00我们来分析一下上面的命令,看看各个参数的作用。File1.txt-源文件ostechnix-远程系统的用户名192.168.1.40-远程系统的IP地址/home/ostechnix/-远程系统中的目标目录。这是我们要传输源文件的绝对路径,比如File.txt。您还可以修改目标文件的名称。下面的命令会将File1.txt传输到目的地并将其另存为myfile.txt。$scpFile1.txtostechnix@192.168.1.40:/home/ostechnix/myfile.txt从本地复制文件到远程系统2.使用scp从本地系统复制多个文件到远程系统使用scp命令复制多个来传输一个文件从本地系统到远程系统,运行:$scpFile1.txtFile2.txtostechnix@192.168.1.40:/home/ostechnix/示例输出:ostechnix@192.168.1.40'spassword:File1.txt100%104689.4KB/s00:00File2.txt100%4966.3MB/s00:00将多个文件从本地复制到远程系统:File1.txt和File2.txt-源文件名ostechnix@192.168.1.40-用户名和远程系统的IP地址/home/ostechnix-目标文件的路径如果文件具有相同的扩展名,您可以使用以下替代命令来实现相同的目标。$scp{File1,File2}.txtostechnix@192.168.1.40:/home/ostechnix/或者$scp*.txtostechnix@192.168.1.40:/home/ostechnix/3.使用SCP将目录从本地递归复制到远程系统使用-r参数递归地将整个目录(包括子目录及其内容)从本地复制到远程系统。$scp-rDocuments/ostechnix@192.168.1.40:/home/ostechnix/将目录从本地复制到远程系统上述命令将整个Documents目录及其内容复制到目标系统。其中,-r-递归复制文件和目录,包括子目录及其内容文件-源目录名ostechnix@192.168.1.40-远程系统的用户名和IP地址/home/ostechnix-目标目录的路径4.使用SCP将文件从远程系统传输到本地记住我们将File1.txt从本地系统复制到远程系统,让我们将它复制回本地。使用scp命令将文件从远程系统复制到本地,运行:$scpostechnix@192.168.1.40:/home/ostechnix/File1.txtDownloads/其中ostechnix@192.168.1.40-远程系统的用户名和IP地址/home/ostechnix/File.txt-远程系统上文件的绝对路径下载-本地保存复制文件的位置将文件从远程系统传输到本地从远程系统传输到本地从复制多个文件远程系统到本地,并在花括号中指明文件的绝对路径,如下:$scpostechnix@192.168.1.40:/home/ostechnix/\{File1.txt,File2.txt\}Downloads/Transfermultiple文件从远程系统到本地上面的命令会将File1.txt和File2.txt从远程系统的/home/ostechnix/目录复制到本地Downloads目录。请注意,花括号内的逗号后没有空格。6.将目录从远程系统递归复制到本地使用scp将整个目录(包括子目录及其内容)从远程系统递归复制到本地系统,使用-r参数。$scp-rostechnix@192.168.1.40:/home/ostechnix/DocumentsDownloads/上述命令会将整个Documents目录从远程系统复制到本地Downloads目录。7.使用SCP在两台远程计算机之间复制文件要使用scp命令将文件直接从一台远程系统复制到另一台,请运行:$scpsenthil@192.168.1.40:/home/senthil/File1.txtkumar@192.168.1.20:/home/kumar/会要求你输入两个远程系统的密码:其中,Senthil@192.168.1.40-文件源处远程系统的用户名和IP地址/home/senthil/File1.txt-复制的文件名及其位置kumar@192.168.1.20-将文件复制到目标端的用户名和IP地址/home/kumar-保存在目标端的上面的命令会将/home/senthil/File1.txt从远程主机192.168.1.40复制到192.168.1.20上的/home/kumar/目录。在这种方法中,数据将直接从一个远程系统传输到另一个远程系统。如果要通过本地计算机路由流量,请使用-3参数,如下所示:$scp-3senthil@192.168.1.40:/home/senthil/File1.txtkumar@192.168.1.20:/home/kumar/8。使用SCP复制文件时启用压缩到目前为止,我们已经传输了未压缩的文件。现在我们将使用-C参数在传输文件时启用压缩。$scp-CFile1.txtostechnix@192.168.1.40:/home/ostechnix/-C参数将在源端启用压缩并在目标端自动解压缩数据。通过启用压缩,您可以显着提高文件复制或传输速度。9、使用SCP传输文件时限制带宽我们可以使用-l参数来限制带宽。注意最大带宽单位是Kbits/s。1字节=8位。因此,如果要将带宽限制为200KB/s,-l的值将是1600(200*8)。$scp-l1600File1.txtostechnix@192.168.1.40:/home/ostechnix/这在传输大文件以防止SCP限制带宽时很有用。10.使用SCP复制文件时使用不同的端口作为系统管理员,您可能出于安全原因更改了远程服务器上SSH协议的默认端口。这种情况下可以使用-P参数指定传输文件时的端口号。注意:大写P.$scp-P2022File1.txtostechnix@192.168.1.40:/home/ostechnix/11。使用SCP复制文件时使用不同的加密方法默认情况下,SCP使用AES-128加密文件。如果要使用不同的加密方法,请使用c参数。例如要使用3des-cbc加密方式,命令如下:$scp-c3des-cbcFile1.txtostechnix@192.168.1.40:/home/ostechnix/查看支持的密码列表,执行:$ssh-Qcipherlocalhost|粘贴-d,-s-示例输出:3des-cbc,aes128-cbc,aes192-cbc,aes256-cbc,rijndael-cbc@lysator.liu.se,aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com,chacha20-poly1305@openssh.com12.在详细模式下使用SCP复制文件如果你想知道用scp复制文件时幕后发生了什么,你可以使用-v参数。使用verbose模式传输文件时,执行scp命令的每一步都会显示在终端上。这在故障排除时很方便。$scp-vFile1.txtostechnix@192.168.1.40:/home/ostechnix/当以详细模式发送文件时,你会看到很多这样的输出:CopyingfilesusingSCPinverbosemode13.InquietmodeUsingSCPto传输文件我们可以使用-q参数在安静模式下传输文件。在安静模式下共享文件时,输出中不会显示任何进度、警告或诊断信息。$scp-qFile1.txtostechnix@192.168.1.40:/home/ostechnix/14.使用SCP传输文件时保留文件属性使用-p参数保留文件修改时间、访问时间和模式等文件属性。请注意,这是一个小写的p。$scp-pFile1.txtostechnix@192.168.1.40:/home/ostechnix/15.使用SCP复制文件时使用标识文件SSH支持基于密码和密钥的身份验证。密钥是Linux环境中使用最广泛的身份验证方法。如果要在传输文件时使用基于密钥的身份验证,请使用-i参数指定身份文件或私钥。$scp-imy_private_key.pemFile1.txtostechnix@192.168.1.40:/home/ostechnix/16.使用不同的ssh配置文件在某些情况下,您需要使用不同的网络连接到Linux系统,或者您有代理服务器。在这种情况下,您可以使用带有-F参数的不同ssh_config文件。$scp-F/home/ostechnix/my_ssh_configFile1.txtostechnix@192.168.1.40:/home/ostechnix/17.使用IPv4或IPv6复制文件我们可以强制SCP在复制文件时仅使用IPv4或IPv6地址。这可以通过为IPv4网络添加-4参数和为IPv6网络添加-6参数来实现。$scp-6File1.txtostechnix@192.168.1.40:/home/ostechnix/FAQ问题一:什么是SCP?SCP是一个命令行程序,旨在安全地将文件和目录从本地系统传输到远程系统,反之亦然,或者直接在两个远程系统之间传输。问题2:如何使用SCP将文件从本地复制到远程计算机?从本地复制文件到远程系统,命令如下:scpSourceFile.txtUser@RemoteHost:/some/remote/directory问题3:如何递归复制文件和目录?递归复制一个包含子目录的目录,使用-r参数:scp-r/some/local/directoryUser@RemoteHost:/some/remote/directory问题4:我可以使用SCP传输多个文件吗?当然,只需将源文件名用空格分隔即可。从本地复制多个文件到远程:scpfile1.txtfile2.txtfile3.txtUser@RemoteHost:/some/remote/directoryscp{file1,file2,file3}.txtUser@RemoteHost:/some/remote/directoryscp*.txtUser@RemoteHost:/some/remote/directory将多个文件从远程复制到本地:scpUser@RemoteHost:/some/remote/directory/\{file1.txt,file2.txt,file3.txt\}/some/local/directory将多个文件从一个远程系统复制到另一个:$scpUser@RemoteHost1:/some/remote/directory/\{file1.txt,file2.txt,file3.txt\}User@RemoteHost2:/some/remote/directory/问题5:如何将目录下的所有文件全部转移?转移整个目录,首先进入目录:cddir_name然后,scp*.txtUser@RemoteHost:/some/remote/directory问题6:文件可以压缩吗?当然。使用-C压缩文件。文件在源处压缩并在目标处自动解压缩。scp-C/some/large/fileUser@RemoteHost:/some/remote/directory问题七:文件属性可以保留吗?要保留原始文件的修改时间、访问时间和模式等文件属性,请使用-p参数。scp-pfile.txtUser@RemoteHost:/some/remote/directory问题8:我可以使用其他端口吗?当然。带有-P参数的SCP允许您使用其他端口。scp-P2022file.txtUser@RemoteHost:/some/remote/directory问题9:我可以使用不同的加密方式吗?当然。使用-c参数。scp-c3des-cbcUser@RemoteHost:/some/remote/directory问题10:如何列出SSH支持的加密方式?使用以下命令查看SSH和SCP支持的加密方法列表:ssh-Qcipherlocalhost|paste-d,-s-问题11:SCP真的安全吗?当然,使用它是完全安全的。SCP和openSSH使用相同的SSH机制。传输的数据在源端加密,在目的地解密。问题12:我可以将文件从Windows系统传输到Linux吗?当然。使用PSCP程序从windows向Linux平台传输文件,也可以使用WinSCP。总结在这份综合指南中,我们了解了SCP是什么以及如何使用它在Linux中安全地传输文件,包括17个SCP命令示例,以及有关SCP的常见问题解答。无论您是Linux管理员、开发人员还是普通用户,在某些时候都会面临将文件复制到远程系统或从远程系统复制文件的情况,了解如何使用SCP安全地复制文件将非常有用。