OpenSSH是SSH连接工具的免费版本。telnet,rlogin和ftp用户可能还没意识到他们在互联网上传输的密码是未加密的,但SSH是加密的,OpenSSH加密所有通信(包括密码),有效消除了窃听,连接劫持和其它攻击。此外,OpenSSH提供了安全隧道功能和多种身份验证方法,支持SSH协议的所有版本。
SSH是一个非常伟大的工具,如果你要在互联网上远程连接到服务器,那么SSH无疑是最佳的候选。
一.SSH基础命令
1.SSH远程登录
假定你要以用户名root,登录远程主机192.168.1.104
1.1.口令登录
需要输入密码
# 常用用法
ssh root@192.168.1.104
# 本地用户名与远程用户名一致,登录时可以省略用户名
ssh 192.168.1.104
# SSH的默认端口是22,使用p参数,可以修改这个端口
ssh -p 2222 root@192.168.1.104
1.2.公钥登录
# 生成秘钥和公钥
ssh-keygen
# 将公钥传送到远程主机host上
# 方法一
ssh-copy-id root@192.168.1.104
# 方法二
ssh root@192.168.1.104 'mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys' << ~/.ssh/id_rsa.pub
2.通过中间主机建立SSH连
# 直接连接到只能通过 hostA 连接的 hostB
# hostB 表示从本地网络无法直接访问的主机,但可以从 hostA 所在网络访问
# 这个命令通过到 hostA 的“隐藏”连接,创建起到 hostB 的连接
ssh -t hostA ssh hostB
3.通过SSH连接屏幕
# 直接连接到远程屏幕会话(节省了无用的父bash进程)
ssh -t root@192.168.1.104 screen –r
# 建立一个可以重新连接的远程GNU screen
ssh -t root@192.168.1.104 screen –xRR
二.SSH远程操作
SSH不仅可以用于远程主机登录,还可以直接在远程主机上执行操作
1.SSH数据传输
1.1.将~/.ssh/
目录下面的所有文件,复制到远程主机的~/.ssh/
目录
cd && tar czv .ssh | ssh root@192.168.1.104 'tar xz'
1.2.将远程主机~/.ssh/
目录下面的所有文件,复制到用户的当前目录
ssh root@192.168.1.104 'tar cz .ssh' | tar zxv
2.通过SSH运行复杂的远程shell命令
ssh 192.168.1.104 -l root "cat ~/.ssh/authorized_keys"
3.比较远程和本地文件
# 比较本地文件和远程文件是否有差异
ssh root@192.168.1.104 "cat ~/.ssh/authorized_keys" | diff ~/.ssh/authorized_keys –
4.通过SSH将MySQL数据库复制到新服务器
# 通过压缩的SSH隧道Dump一个MySQL数据库,将其作为输入传递给mysql命令
mysqldump –add-drop-table –extended-insert –force –log-error=error.log -uUSER -pPASS OLD_DB_NAME \
| ssh -C user@newhost "mysql -uUSER -pPASS NEW_DB_NAME"
5.实时SSH网络吞吐量测试
# 通过SSH连接到主机,显示实时的传输速度,将所有传输数据指向/dev/null,需要先安装pv
yes | pv | ssh root@192.168.1.104 "cat > /dev/null"
6.scp 跨机远程拷贝
scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的。可能会稍微影响一下速度。两台主机之间复制文件必需得同时有两台主机的复制执行帐号和操作权限。
6.1.scp命令参数
- -1 强制scp命令使用协议ssh1
- -2 强制scp命令使用协议ssh2
- -4 强制scp命令只使用IPv4寻址
- -6 强制scp命令只使用IPv6寻址
- -B 使用批处理模式(传输过程中不询问传输口令或短语)
- -C 允许压缩。(将-C标志传递给ssh,从而打开压缩功能)
- -p 留原文件的修改时间,访问时间和访问权限。
- -q 不显示传输进度条。
- -r 递归复制整个目录。
- -v 详细方式显示输出。scp和ssh(1)会显示出整个过程的调试信息。这些信息用于调试连接,验证和配置问题。
- -c cipher 以cipher将数据传输进行加密,这个选项将直接传递给ssh。
- -F ssh_config 指定一个替代的ssh配置文件,此参数直接传递给ssh。
- -i identity_file 从指定文件中读取传输时使用的密钥文件,此参数直接传递给ssh。
- -l limit 限定用户所能使用的带宽,以Kbit/s为单位。
- -o ssh_option 如果习惯于使用ssh_config(5)中的参数传递方式,
- -P port 注意是大写的P, port是指定数据传输用到的端口号
- -S program 指定加密传输时所使用的程序。此程序必须能够理解ssh(1)的选项。
6.2.scp一般有六种使用方法
# 本地复制远程文件:(把远程的文件复制到本地)
scp root@192.168.1.104:/test.tar.gz ./test.tar.gz
# 远程复制本地文件:(把本地的文件复制到远程主机上)
scp ./test.tar.gz root@192.168.1.104:/test.tar.gz
# 本地复制远程目录:(把远程的目录复制到本地)
scp -r root@192.168.1.104:/val/test/ /val/test/
# 远程复制本地目录:(把本地的目录复制到远程主机上)
scp -r ./ root@192.168.1.104:/test/datasets
# 本地复制远程文件到指定目录:(把远程的文件复制到本地)
scp root@192.168.1.104:/val/test/test.tar.gz /val/test/
# 远程复制本地文件到指定目录:(把本地的文件复制到远程主机上)
scp /test.tar.gz root@192.168.1.104:/
三.SSH端口操作
1.绑定本地端口
既然SSH可以传送数据,那么我们可以让那些不加密的网络连接,全部改走SSH连接,从而提高安全性。
假定我们要让8080端口的数据,都通过SSH传向远程主机,命令就这样写:
ssh -D 8080 root@192.168.1.104
SSH会建立一个socket,去监听本地的8080端口。
一旦有数据传向那个端口,就自动把它转移到SSH连接上面,发往远程主机。可以想象,如果8080端口原来是一个不加密端口,现在将变成一个加密端口。
2.本地端口转发
假定host1是本地主机,host2是远程主机。由于种种原因,这两台主机之间无法连通。
但是,另外还有一台host3,可以同时连通前面两台主机。因此,很自然的想法就是,通过host3,将host1连上host2。
我们在host1执行下面的命令:
# ssh -L 本地端口:目标主机:目标主机端口
# 连接host1的2121端口,就等于连上了host2的21端口
ssh -L 2121:host2:21 host3
ftp localhost:2121
# 连接host1的9001端口,就等于连上了host2的22端口
ssh -L 9001:host2:22 host3
ssh -p 9001 localhost
3.远程端口转发
既然"本地端口转发"是指绑定本地端口的转发,那么"远程端口转发"(remote forwarding)当然是指绑定远程端口的转发。
还是接着看上面那个例子,host1与host2之间无法连通,必须借助host3转发。但是,特殊情况出现了,host3是一台内网机器,它可以连接外网的host1,但是反过来就不行,外网的host1连不上内网的host3。这时,"本地端口转发"就不能用了,怎么办?
解决办法是,既然host3可以连host1,那么就从host3上建立与host1的SSH连接,然后在host1上使用这条连接就可以了。
我们在host3执行下面的命令:
# ssh -R 远程主机端口:目标主机:目标主机端口
ssh -R 2121:host2:21 host1
ftp localhost:2121
让host1监听它自己的2121端口,然后将所有数据经由host3,转发到host2的21端口。由于对于host3来说,host1是远程主机,所以这种情况就被称为"远程端口绑定"。
四.SSH的其他参数
1.N参数,T参数
表示只连接远程主机,不打开远程shell;T参数,表示不为这个连接分配TTY。
这个两个参数可以放在一起用,代表这个SSH连接只用来传数据,不执行远程操作。
ssh -NT -D 8080 host
2.f参数,表示SSH连接成功后,转入后台运行。这样一来,你就可以在不中断SSH连接的情况下,在本地shell中执行其他操作
# 要关闭这个后台连接,就只有用kill命令去杀掉进程
ssh -f -D 8080 host
问题与支持
- Blog : https://blog.darebeat.cn
- Github: https://github.com/darebeat
- Gitee : https://gitee.com/darebeat