首页 > 编程知识 正文

怎么通过ssh传文件到服务器(通过ssh传输文件)

时间:2023-05-06 05:34:37 阅读:80447 作者:4502

在理解

什么是 SFTP ?

sftp之前,让我们先来看看什么是FTP。 文件传输协议(FTP )是在两个终端系统之间传输文件的常用方法。

SFTP是指SSH文件传输协议(SSH文件传输协议)或安全文件传输协议。 SFTP是一个独立的SSH封装协议包,通过安全的连接同样工作。 其优点是可以使用安全的连接传输文件,并且可以在本地系统和远程系统上的文件系统之间来回移动。

大多数情况下,优先选择SFTP而不是FTP。 这是因为SFTP最基本的安全功能和SSH连接可用。 FTP是不安全的协议,必须只在特定情况或受信任的网络上使用。

虽然SFTP集成了许多图形工具,但是本用户指南介绍了如何使用交互式命令行界面。 以下是使用指南。

如何使用 SFTP 连接

缺省情况下,SFTP使用SSH协议进行认证并建立安全连接。 因此,可以使用SSH中存在的相同认证方法。

虽然使用密码进行默认设置很方便,但是强烈建议您创建一个SSH密钥,并将其传递给所有需要访问公钥的系统。 从长远来看,这更安全,节省你的时间。

如果尚未设置SSH密钥,请单击此处查看《设置SSH密钥指南》(稍后将讨论LinuxStory是否翻译),以设置SSH密钥以访问服务器。

如果可以使用SSH连接到主机,则需要使用SFTP管理文件的所有请求都已完成。 使用以下命令测试SSH访问:

用户名@远程主机名称或IP

如果上一个命令成功,则输入该命令后退出。

退出

建立SSH连接以打开SFTP会话。 在此过程中,可以使用以下命令:

STP用户名@远程主机名称或IP

现在,你连接到远程系统,你的提示符也将成为SFTP提示符。

在 SFTP 命令行中查看帮助文档

老规矩,首先知道最有用的命令—— help,它会给你提供SFTP的帮助概要。 可以输入以下两个选项之一来打开帮助:

帮助

然后,将显示以下命令的列表:

可用命令3360 byequitsftpcdpathchangeremotedirectoryto ' path ' chgrpgrppathchangegroupoffile ' path ' to ' grp ' chmooon chownownpathchangeowneroffile ' path ' to ' own ' df [-hi ] [ path ]显示系统资源定位符系统连接remote [ local ] downloadfilehelpdisplaythishelptextlcdpathchangelocaldirectoryto ' path ' .接下来,我们将研究这些命令。

SFTP Shell 基本操作

我们可以使用类似于大多数本机shell的命令来查看整个目录结构。

首先,确定当前的工作目录。 怎么确定? 与大多数shell会话一样,可以输入以下命令来获取当前目录信息:

pwd

远程工作目录: /家庭/显示器

另一个熟悉的命令—— ls显示当前目录下的内容

洛杉矶

摘要. txtinfo.txt temp.txttestdirectory

值得注意的是,SFTP命令行中没有常见的shell功能,而是有选择地实现了一些重要的参数。

洛杉矶航空母舰

rwxr-xr-xr-x 5显示器4096 aug 1315336011.drwxr-xr-x 3根根4096 aug 1315336002 .-rw---- 1显示器4.bb

mouser demouser 3486 Aug 13 15:02 .bashrc drwx------ 2 demouser demouser 4096 Aug 13 15:04 .cache -rw-r--r-- 1 demouser demouser 675 Aug 13 15:02 .profile . . .

使用下面的命令可以切换到另一个目录:

cd testDirectory

现在我们就可以遍历远程文件系统了!但是如果我们需要访问本地文件系统,要怎么办呢?我们只需要给刚才的这些命令加一个前缀“ l ”( L 的小写),即可实现对本地主机操作。

到目前为止,我们谈到的所有命令都有对应的本地版,我们可以这样打印出本地主机工作目录:

lpwd

Local working directory:/Users/demouser

同样,我们这样可以列出本机上当前工作目录的内容:

lls

Desktop local.txt test.html Documents analysis.rtf zebra.html

显然,我们也可以很方便的在一个 Shell 里任意切换本地主机和远程主机的当前工作目录:

lcd Desktop

使用 SFTP 传输文件

仅仅访问两个文件系统之间的内容却不能在本地和远程文件系统之间传输文件,那简直就是牛鼎烹鸡。

下载远程文件到本地主机

如果我们想从远程主机上下载文件,跟着我这样做:

get remote_file_name

Fetching /home/demouser/remoteFile to remote_file_name /home/demouser/remote_file_name 100% 37KB 36.8KB/s 00:01

正如你看到的,在默认情况下,“ get ”命令把远程主机上的文件下载到本地主机而且保证文件名不变。

想改变名字?没问题!直接指定一个不同的文件名来复制远程文件即可:

get remote_file_name local_file_name

说到这里,不得不告诉你,“ get ”命令还有一些可选参数。比如,我们可以打开递归选项来递归的复制一个文件夹里面的内容:

get -r some_directory_name

我们还可以打开“ -P ”或者“ -p ”参数来告诉 SFTP 保持文件的权限访问位的设置和访问时间:

get -Pr some_directory_name

上传本地文件到远程主机

使用见名知意的“ put ”命令可以很容易的将文件上传到远程主机:

put local_file_name

Uploading localFile to /home/demouser/local_file_name local_file_name 100% 7607 7.4KB/s 00:00

” put “具有类似“ get ”的参数。这样,你可以上传整个文件夹:

put -r local_directory_name

注意

在目前发布的 Ubuntu 系统(至少是 14.04-15.10 )上运行的 OpenSSH 版本有一个 BUG ,执行以上命令会报错。使用有BUG 的 OpenSSH 时,在执行上述命令传输文件到服务器上时,会报这样的错:Couldn't canonicalise: No such file or directory

要解决这个问题,可以输入 mkdir local_directory_name在远程系统上先新建目标目录。这样之后,执行上面的命令应该就不会报错了。

在我们下载和上传文件时使用到一个大家熟知而且很有用的工具——“ df ”命令,和其他命令行里工作方式相同。通过它,你可以检查是否有足够的空间来完成你想要传输的文件:

df -h

Size Used Avail (root) %Capacity 19.9GB 1016MB 17.9GB 18.9GB 4%

请注意!这个命令没有对应的 ldf ,但我们可以使用“ ! ”这个命令达到相同目的。(说到这里,想起 LinuxStory 有一篇文章《 Linux 命令行下” ! ”的十个神奇用法》,很不错,推荐给没看到的小伙伴,点击这里获取。)

这个“ ! ”(半角叹号)命令把我们带回到本地 Shell ,在这里可以运行所有在我们本地系统可用的命令。通过输入下面命令来检查我们的硬盘使用情况:

!

df -h

Filesystem Size Used Avail Capacity Mounted on /dev/disk0s2 595Gi 52Gi 544Gi 9% / devfs 181Ki 181Ki 0Bi 100% /dev map -hosts 0Bi 0Bi 0Bi 100% /net map auto_home 0Bi 0Bi 0Bi 100% /home

像这样,任何其他的本地命令都会如你期望的那样有效。返回 SFTP 会话,输入:

exit

现在,你应该就能看到 SFTP 提示符又回来了。

其实还可以不退出 SFTP Shell 执行本地主机命令,如果你在 VIM 里面执行过 Shell 指令,我想你应该明白什么意思。

使用 SFTP 进行简单的文件操作

SFTP 允许你执行基本的文件维护类型,在有文件系统的时候很有用。

例如,你可以使用下面命令更改远程系统上的文件所有者:

chown userID file

请注意,和系统“ chmod ”命令不同,这个 SFTP 命令不接受用户名,取而代之的是用户的 UID 。不幸的是,没有简便的方法通过 SFTP 接口得到相应的 UID 。

这个棘手的问题可以使用这个命令解决:

get /etc/passwd !less passwdroot:x:0:0:root:/root:/ssdkj/bash daemon:x:1:1:daemon:/usr/sssdkj:/ssdkj/sh ssdkj:x:2:2:ssdkj:/ssdkj:/ssdkj/sh sys:x:3:3:sys:/dev:/ssdkj/sh sync:x:4:65534:sync:/ssdkj:/ssdkj/sync games:x:5:60:games:/usr/games:/ssdkj/sh man:x:6:12:man:/var/cache/man:/ssdkj/sh . . .

请注意,是“ ! ”而不是“ l ”,这和之前的“ l ”前缀不一样,使用它我们可以像在 VIM 里面一样的方式执行本地 Shell 指令。之前就已经在本地“ df ”命令上使用过。

UID 会出现在文件中的第三列,通过冒号界定。

同样,我们可以更改文件属组:

chgrp groupID file

再次提醒,想要得到远程系统的 GID 也不是那么简单的。我们可以用同样的方式来解决:

get /etc/group !less grouproot:x:0: daemon:x:1: ssdkj:x:2: sys:x:3: adm:x:4: tty:x:5: disk:x:6: lp:x:7: . . .

显然我们可以看到第三列就是对应第一列用户所在组的 GID 。这就是我们要找的东西!

幸运的是,这个“ chmod ”命令可以在远程文件系统上执行这样的指令:

chmod 777 publicFile

Changing mode on /home/demouser/publicFile

虽然没有现成的命令来操作本地文件权限,但是你可以设置本地的 umask 。这样,任何复制到本地系统的文件都有相应的权限。

使用“ lumask ”命令来完成这个操作:

lumask 022

Local umask: 022

现在所有的常规文件下载(只要没有打开“ -p ”参数)都会有 644 权限。

SFTP 允许你在本地文件系统和远程文件系统上新建目录,分别使用 ” lmkdir ” 和 ” mkdir “命令,这绝对有用!

这剩下的文件命令就只有针对远程文件系统的了:

ln rm rmdir

这些命令复制 Shell 版本的基本特性。如果你需要在本地文件系统执行这些操作,请记住,你可以输入这个命令切换至 Shell :

!

或者在本地系统执行这一个加“ ! ”前缀的命令,像这样:

!chmod 644 somefile

kdzs完成了 SFTP 会话,使用“ exit ”或者“ bye ”来关闭连接:

bye

总结

虽然 SFTP 是一个很简单的工具,但用它来管理服务器并在客户端与服务器之间传输文件是非常方便的。

如果你习惯使用 FTP 或者 SCP 来实现你的传输,那么,你可以试试 SFTP ,它集两家之所长。虽然它不是在所有的情况下都如你所愿,但它是一个灵活的工具,值得加入你的技能库!

By 傻傻的篮球 Ellingwood

原文链接:https://www.digitalocean.com/community/tutorials/how-to-use-sftp-to-securely-transfer-files-with-a-remote-server

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。