SSH、SFTP、SCP总结

SSH

首先在服务器上安装ssh的服务器端,Ubuntu默认不安装

1
sudo apt-get install openssh-server

启动ssh-server。

1
/etc/init.d/ssh restart

确认ssh-server已经正常工作。

1
2
3
netstat -tlp

tcp6 0 0 *:ssh *:* LISTEN -

看到上面这一行输出说明ssh-server已经在运行了。

客户端通过ssh登录服务器。假设服务器的IP地址是47.103.17.102,登录的用户名是root。

1
ssh -l root 47.103.17.102

接下来会提示输入密码,然后就能成功登录到服务器上了。

若默认端口不是22,以27950端口为例:

1
ssh -p 27950 root@47.103.17.102

注意这里的p为小写。

ssh免密

本地客户端,使用cat ~/.ssh/id_rsa.pub指令查看本地的公钥。然后复制全部内容到服务器端/root/.ssh/authorized_keys文件中,设置/etc/ssh/sshd_configPasswordAuthentication yes

若此时免密登陆报错Permission denied (publickey,password,keyboard-interactive),则尝试更改文件权限。

1
2
3
# 在云服务器上给.ssh文件夹和authorized_keys文件授权(普通用户的话home目录路径为 /home/用户名)
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh

若之前连接过某个服务器,现在该服务器重装了,需要将本地客户端的~/.ssh/known_hosts中涉及到该服务器的记录删除。当然直接清空~/.ssh/known_hosts也行。

known_hosts

含义

known_hosts中存储的是服务器的公钥,在ssh登录过程中的作用如下:

1、远程主机收到本地机的登录请求后会将自己的公钥发给本地机;

2、本地机使用这个公钥将密码加密后,发送回远程主机;

3、远程主机用自己的私钥解密登录密码,如果密码正确,则同意登录。

从MacOS的终端首次通过ssh登录远程主机时,会提示:

1
2
3
The authenticity of <hostname>'XXX.XXX.XXX.XXX' can't be established.
RSA key fingerprint is XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX
Are you sure you want to continue connecting (yes/no)?

这里的意思是本地机无法确认远程主机的真实性,需要用户判断是否信任传来的RSA Key FingerPrint,键入yes后,接着就会提示:

1
Warning: Permanently added 'XXXX, XXX.XXX.XXX.XXX'(RSA)to the list of known hosts.

然后输入远程主机密码就可以正常登录了。

此时意味着本地机已经接受了远程主机,并且会将此公钥保存在/.ssh/known_hosts中,以便之后的验证。

作用

A通过ssh首次连接到B,B会将公钥1(host key)传递给A,A将公钥1存入known_hosts文件中,以后A再连接B时,B依然会传递给A一个公钥2,OpenSSH会核对公钥,通过对比公钥1与公钥2 是否相同来进行简单的验证,如果公钥不同,OpenSSH会发出警告Host key verification failed., 避免你受到DNS Hijack之类的攻击。

config

ssh除了命令行配置参数外,还可以通过配置文件来辅助管理,有两个级别的配置文件

  • 用户级(user-specific file):~/.ssh/config,通常不存在,如果需要自己新建
  • 系统级(system-wide file):/etc/ssh/ssh_config,内置有一些默认配置

访问权限

用户配置文件的访问权限设置为用户可读可写,组和其他不能操作:

1
2
chmod 700 ~/.ssh
chmod 600 ~/.ssh/*

若不这样配置权限,会出现Bad owner or permissions on ssh config file。The error is coming from the openssh code below:

1
2
3
if (((sb.st_uid != 0 && sb.st_uid != getuid()) ||
(sb.st_mode & 022) != 0))
fatal("Bad owner or permissions on %s", filename);

So translating it to the English, means that the config file must be owned by root or by the user running the ssh and can not be writable by any group or other users.

优先级

参数数据解析顺序如下:

  1. 命令行选项
  2. 用户配置文件
  3. 系统配置文件

所有的配置选项仅第一次设置有效,所以可以将默认值放置在系统配置文件,修改参数放置在用户配置文件。

配置方式

用配置文件可以管理多个远程服务器,其格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Host 服务器名A
user 用户名
hostname 服务器ip
port 端口号
identityfile 本地私钥地址
...
Host 服务器名B
user 用户名
hostname 服务器ip
port 端口号
identityfile 本地私钥地址
...
...
...
Host *
...
...

通过Host指定配置块,用tab键来区分配置头和内置参数

所有参数值都可使用通配符设定,比如可以设置一个Host值为星号(*),用于设置全局配置

注释用#号开头

配置文件不区分大小写,所以Hosthost一样

常用配置选项

  • 必须配置
    • Host:指定配置块
    • User:指定登录用户
    • Hostname:指定服务器地址,通常用ip地址
    • Port:指定端口号,默认值为22
  • 可选
    • Identityfile:指定本地认证私钥地址
    • ForwardAgent yes:允许ssh-agent转发
    • IdentitiesOnly:指定ssh是否仅使用配置文件或命令行指定的私钥文件进行认证。值为yesno,默认为no,该情况可在ssh-agent提供了太多的认证文件时使用
    • IdentityFile:指定认证私钥文件
    • StrictHostKeyChecking有3种选项:
      • ask:默认值,第一次连接陌生服务器时提示是否添加,同时如果远程服务器公钥改变时拒绝连接
      • yes:不会自动添加服务器公钥到~/.ssh/known_hosts中,同时如果远程服务器公钥改变时拒绝连接
      • no:自动增加新的主机键到~/.ssh/known_hosts

使用方式

比如配置文件如下:

1
2
3
4
Host server
user ubuntu
hostname 123.231.032.123
port 22

连接方式如下:

1
2
3
4
# 登录远程服务器
$ ssh server
# 传输文件
$ scp hello.txt server:/home/ubuntu/

调试

我们在使用ssh登录时,经常遇到无法登录成功的情况,这时可以使用ssh -v 账户名@ip进行调试。

SFTP

SFTP和SSH采用同一个端口,该指令可以用于文件传输。

要连接到远程 sftp 服务器,如下建立一个安全 SSH 连接并创建 SFTP 会话(-P 端口号):

1
sftp root@47.103.17.102

若端口不是默认的22端口,以27950端口为例:

1
sftp -P 27950 root@47.103.17.102

注意这里的P为小大写。

登录到远程主机后,你可以如下运行交互式的 sFTP 命令:

1
2
3
4
sftp> ls            #list directory 
sftp> pwd #print working directory on remote host
sftp> lpwd #print working directory on local host
sftp> mkdir uploads #create a new directory

如何使用 sFTP 上传文件

使用put指令即可。

1
2
# put [本地文件的地址] [服务器上文件存储的位置]
sftp> put text.md

如何使用 sFTP 下载文件

使用get指令即可。

1
2
# get [服务器上文件存储的位置] [本地要存储的位置]
sftp> get text.md

如何使用 sFTP 上传文件夹

要将整个目录上传到远程 Linux 主机中,请使用 put 命令。但是,如果目录名称不存在于远程主机上的工作目录中,你将收到错误

因此,首先在远程主机上创建一个具有相同名称的目录,然后从本地主机上传它,-r 参数允许拷贝子目录和子文件:

1
2
3
sftp> put -r  Tecmint.com-articles # 报错
sftp> mkdir Tecmint.com-articles
sftp> put -r Tecmint.com-articles

要保留修改时间、访问时间以及被传输的文件的模式,请使用-p 标志。

1
sftp> put -pr Tecmint.com-articles

如何使用 sFTP 下载文件夹

要从远程 Linux 主机下载整个 fstools-0.0 文件夹到本机中,如下所示使用 get 命令带上 -r 标志:

1
sftp> get -r fstools-0.0

如果文件夹已经下载完成了,接着查看本机的工作目录。

退出

要退出 sFTP shell,输入:

1
2
3
sftp> bye
或者
sftp> exit

SCP

scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的。可能会稍微影响一下速度。当你服务器硬盘变为只读 read only system时,用scp可以帮你把文件移出来。另外,scp还非常不占资源,不会提高多少系统负荷,在这一点上,rsync就远远不及它了。虽然 rsync比scp会快一点,但当小文件众多的情况下,rsync会导致硬盘I/O非常高,而scp基本不影响系统正常使用。

如何使用 scp 上传文件

命令格式:

1
2
3
4
5
6
7
scp local_file remote_username@remote_ip:remote_folder
或者
scp local_file remote_username@remote_ip:remote_file
或者
scp local_file remote_ip:remote_folder
或者
scp local_file remote_ip:remote_file
  • 第1,2个指定了用户名,命令执行后需要输入用户密码,第1个仅指定了远程的目录,文件名字不变,第2个指定了文件名
  • 第3,4个没有指定用户名,命令执行后需要输入用户名和密码,第3个仅指定了远程的目录,文件名字不变,第4个指定了文件名

如何使用 scp 上传文件夹

命令格式:

1
2
3
scp -r local_folder remote_username@remote_ip:remote_folder
或者
scp -r local_folder remote_ip:remote_folder

  • 第1个指定了用户名,命令执行后需要输入用户密码;
  • 第2个没有指定用户名,命令执行后需要输入用户名和密码;

如何使用 scp 下载文件

从远程复制到本地的scp命令与上面的命令雷同,只要将从本地复制到远程的命令后面2个参数互换顺序就行了。

如何使用 scp 下载文件夹

从远程复制到本地的scp命令与上面的命令雷同,只要将从本地复制到远程的命令后面2个参数互换顺序就行了。

参考

[SSH]客户端配置文件config
Bad owner or permissions on ssh config file
ssh远程登录报错:kex_exchange_identification: Connection closed by remote host
SSH之known_hosts文件
SFTP的用法

------ 本文结束------
坚持原创技术分享,您的支持将鼓励我继续创作!

欢迎关注我的其它发布渠道