Linux常用命令--ssh、scp与免密登录

摘要

  • ssh、scp命令的使用以及免密登录的设置方法

  • 本文基于CentOS8(x86_64)

ssh

3.1 登录

1
2
3
4
5
6
7
8
# 登录
ssh user@ip  : 默认连接22端口,不同用户名
# 或者使用 -l 指定用户名,此时用户名与ip是分开的,功能同上,两者只是语法的不同
ssh -l user ip

# 指定端口
ssh -p 22122 user@ip  : 不同用户名,指定其它端口
ssh -p 22122 ip  : 相同用户名

3.2 远程执行命令或脚本

1
2
3
4
5
6
7
8
9
10
# 1.无需交互的命令
ssh user@ip "command"
示例:
ssh user@ip "pwd"
ssh user@ip "sh /usr/local/run.sh"

# 2.需要交互的命令,即需要开启一个TTY
ssh user@ip -t "command"
示例:
ssh user@ip -t "top"

3.3 远程服务器上执行本地的脚步

上面都是执行远程服务器上的脚本,如果要在远程服务器上执行本地的脚步,需要使用如下方式:

1
2
3
4
5
# 1.不需要参数
ssh user@ip < script.sh

# 2.需要参数
ssh user@ip 'bash -s' < script.sh param1 param2

scp

1
2
3
4
5
6
7
# 本地传输到远程
scp xxx.txt user@ip:~/xxx.txt : 默认连接22端口,不同用户名
scp -P 22122 xxx.txt user@ip:~/xxx.txt : 不同用户名,指定其它端口
scp -P 22122 xxx.txt ip:~/xxx.txt : 相同用户名

# 远程传输的本地
scp -P 22122 user@192.168.1.219:~/xxx.txt xxx.txt

免密登录(密钥登录)

小贴士

默认情况下,ssh或者scp都需要输入登录密码,如果不想输入密码,可以配置免密登录(密钥登录)
ssh远程执行命令和scp远程传输如果配合免密登录,就可以为脚本自动化打下基础。

1、如果希望从ServerA免输入passwd就可以ssh到ServerB,先在ServerA上执行:

1
2
3
4
5
6
7
8
9
10
11
12
13
$ ssh-keygen -t rsa
中间会让你输入密码并且确认生成目录,默认存放在本地用户的 ~/.ssh目录下 一路回车就好
会生成:id_rsa(密钥) id_rsa.pub(公钥)

-t : 指定加密类型,不指定默认rsa,支持 dsa|ecdsa|ed25519|rsa
-b : 指定密钥长度,默认2048位
-C : 注释,用于识别这个密钥,公钥内容最后会附加这个注释,默认为“用户@主机名”
-f : 生成的密钥文件名称

# 示例
$ ssh-keygen -t rsa -b 4096 -C "hanqunfeng" -f ~/.ssh/sshkey
则 ~/.ssh 路径下会生成两个文件:sshkey 和 sshkey.pub

2、把id_rsa.pub(公钥)的内容保存到ServerB的用户目录下的.ssh目录下的authorized_keys文件中

1
2
3
4
5
6
7
8
9
方式1:
ServerA命令行执行
ssh-copy-id ~/.ssh/id_rsa.pub user@ServerB_IP
-p : 指定端口
-i : 指定私钥路径

方式2:
打开ServerA上的~/.ssh/id_rsa.pub,复制里面内容,粘贴到ServerB的对应用户下的~/.ssh/authorized_keys文件中,保存退出,
如果authorized_keys文件不存在就创建,如果authorized_keys文件中已有内容则粘贴到最后即可。

注意:ServerB 的 .ssh 目录的权限和 authorized_keys 的权限分别是 700 和 600

1
2
chmod 700 -R .ssh
chmod 600 authorized_keys

至此,再次从ServerA通过ssh或者scp连接到ServerB时就不会提示你输入密码啦

实际上证书的创建在任何服务器上进行都行,只需要让ServerA拥有私钥,ServerB的对应用户下的~/.ssh/authorized_keys文件中配置上公钥

1
2
3
4
5
# 此时要求ServerA拥有的私钥的路径必须为~/.ssh/id_rsa
ssh user@ServerB_IP

# 如果私钥名称不是id_rsa,或者没有放置在~/.ssh下,则需要通过 -i 指定私钥路径
ssh -i "~/.ssh/script.pem" user@ServerB_IP

默认情况下,sshd的密钥认证方式是开启的,可以查看ServerB的/etc/ssh/sshd_config中的配置

1
2
3
4
# 是否开启公钥验证
PubkeyAuthentication yes
# 公钥验证文件路径
AuthorizedKeysFile .ssh/authorized_keys

config配置登录信息

通过config配置,可以进一步简化我们使用ssh和scp的方式

1.在用户根目录下的.ssh文件内创建config文件,用于保存ssh登陆主机的相关信息,内容格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Host aliyun                       #就是给服务器起一个别名,后面使用时就是使用这个别名,如 ssh {name}
User root #登录用户名称
HostName 8.130.53.111 #服务器ip地址
Port 22 #服务器登录端口,默认22
IdentityFile ~/.ssh/id_rsa #免密登录的私钥文件路径

# 如果要登录后切换到root用户,可以增加 RemoteCommand和RequestTTY,注意这种方式就没办法再通过ssh执行远程脚本了
RemoteCommand sudo su && cd #登录后要执行的命令,这里表示切换到root用户,这里注意本机的open ssh版本需要大于等于7.6(可用ssh -V查看)
RequestTTY yes #开启TTY

# 通配符匹配
Host 10.10.* #支持通配符,这里表示所有10.10.开头的ip都会被匹配,此时不要配置HostName
User root
Port 22
IdentityFile ~/.ssh/id_rsa
ProxyCommand ssh aliyun -W %h:%p #通过上面配置的aliyun作为跳板机登录到其它服务器上去
RemoteCommand sudo su && cd
RequestTTY yes

# 全局默认配置
Host *
IdentityFile ~/.ssh/id_rsa
Compression yes
ServerAliveInterval 60
ServerAliveCountMax 5
ControlMaster auto
ControlPath ~/.sockets/%r@%h-%p
ControlPersist 4h
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
ConnectTimeout 15
StrictHostKeyChecking no

使用方法
1)ssh 登录:

1
2
ssh aliyun
ssh 10.10.123.123

2)scp 传输文件

1
2
3
4
5
6
# 本地传输到远程
scp ./file aliyun:~/
scp ./file 10.10.123.123:~/
# 远程传输的本地
scp aliyun:~/file ./
scp 10.10.123.123:~/file ./

修改sshd端口和关闭密码登录

1.sshd默认端口是22,建议生产环境进行修改

1
2
3
$ vim /etc/ssh/sshd_config
# 找到 Port 22,默认是注释掉的,解开注释然后将端口22改为你想要的端口号
Port 22122

2.关闭密码登录
如果配置了密钥登录,可以禁止密码登录,建议生产环境进行修改

1
2
3
$ vim /etc/ssh/sshd_config
# 找到 PasswordAuthentication 禁止密码登录设置为 no,允许密码登录设置为 yes
PasswordAuthentication no

3.重启SSH服务:

1
systemctl restart sshd

4.查看sshd端口状态

1
2
netstat -tunpl | grep sshd
tcp 0 0 0.0.0.0:22122 0.0.0.0:* LISTEN 20652/sshd