时间:2018.1.10
作者:李强
参考:man,info,magedu讲义,万能的internet
实验环境:VMware® Workstation 12 Pro ,Centos 6.9,Centos 7.4,SecureCRT Version 8.1.4
声明:以下英文纯属个人翻译,英文B级,欢迎纠正,以下内容纯属个人理解,并没有对错,只是参考,盗版不纠,才能有限,希望不误人子弟为好。
1、OPENSSH
[http://www.openssh.com/portable.html]
OPENSSH是一个历史悠久的工具,BSD的。用来实现ssh协议的一个工具,目前的ssh主版本为V2
主要的软件包有:
openssh(要这个软件包生效,要安装下面的2个软件包)
openssh-server
openssh-clients
配置文件:
/etc/ssh目录
二进制文件:
- opensclient
/usr/bin/ssh|scp|slogin|ssh-agen|ssh-add|ssh-keygen|ssh-copy-in|sftp
- openserver
/usr/bin/sshd|sshd-keygen
帮助文件:
具体查看man ssh|sshd|ssh_config|sshd_config等。
ssh
ssh 用来安全的登录远程主机使用的工具(OPENSSH SSH Client)
语法:
ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec] [-D [bind_address:]port] [-E log_file] [-e escape_char]
[-F configfile] [-I pkcs11] [-i identity_file] [-L [bind_address:]port:host:hostport] [-l login_name] [-m mac_spec]
[-O ctl_cmd] [-o option] [-p port] [-Q cipher | cipher-auth | mac | kex | key] [-R [bind_address:]port:host:hostport]
[-S ctl_path] [-W host:port] [-w local_tun[:remote_tun]] [user@]hostname [command]
描述:
ssh(SSH client)是一个登录远程主机并在远程主机上执行命令的工具。
它是用来取代rlogin和rsh,为2个不可信的主机在不安全的网络上之间建立一个安全的加密的连接。
X11连接和任意的TCP端口都能转发在此安全的通道上。这就是下面的讲的静态端口转发和动态端口转发。
选项 | 说明 |
---|---|
-1,2;-4,6 | 1和2是强制指定用ssh协议的哪个版本,4,6是强制指定ipv4还是ipv6地址,默认版本2,ipv4 |
-b | bind_address 绑定使用本地主机哪个地址作为建立连接源ip,仅在设备有多个地址时考虑使用 |
-c | cipher_spec 选择用户加密会话的加密规范,默认是3des,man ssh_config 查关键字Ciphers有详细信息 |
-e | |
-F | configfile 指定配置文件,如果在命令行指定了配置文件,那么全局配置文件就会被忽略,默认个人配置文件为~/.ssh/config,没有建立 |
-l | login_name 指定登录远程主机的用户名,默认为当前客户端终端用户名 |
-p | port 指定要连接远程主机的哪个接口 |
-v | verbose mode ,打印关于程序的排除故障信息,主要用来排除连接,验证,配置文件的问题,可以多个v,比如-vv,-vvv,最多三个,一个比一个详细 |
-X,x | X11 开启X11转发和关闭X11转发 |
-n | null 将标准输入重定向到/dev/null ,也就是把保准输入都丢给垃圾桶不处理。后面加& 就是后台执行不接收标准输入。参考-f选项 |
例子:
ssh 127.0.0.1 //这是最简单的命令,用户名默认当前主机名,端口默认为22
ssh root@127.0.0.1 -p 9527 //指定登录用户名为root,访问端口为9527
ssh -l root -p 9527 127.0.0.1 //同上
ssh 127.0.0.1 cat /etc/passwd //登录后执行cat /etc/passwd命令即退出
- 基于用户密码的验证
服务器端会将/etc/ssh/sshhost*_key.pub中的公钥传给客户端(选哪个公钥看协商的加密算法是哪个),客户端选择yes/no保存到~/.ssh/know_hosts
然后客户端用基于服务器端的公钥进行数据加密,进行用户名和密码校验,通过后,登录成功。
- 基于key的验证
正常情况下,我们只需要信任服务器即可,但是现在我们要相互信任,就不要对暗号了。
所以clinet生成密钥对,server器本身就有密钥对,现在我们收到了服务器的公钥,此时我们把自己的公钥传给服务器,服务器将其放在~/.ssh/authorized_keys中,以后我们用不同用户登录server的时候,服务器就去响应的用户下找这个文件,然后取出它的公钥来加密一个随机数,client通过自己的私钥解密报文得到随机数,然后通过服务器的公钥加密,server通过自己的私钥解密后,将此随机数和自己的随机数对比,如果一致,则允许登录。
ssh-keygen //生成密钥对
ssh-keygen -p //加密私钥
ssh-copy-id //把公钥复制给远程主机
graph LR
A[client]-->|1:客户端发起请求|B[server]
A[client]-->|2:服务器查找公钥并加密随机数|B[server]
A[client]-->|3:客户端私钥解密,用服务器公钥加密随机数|B[server]
A[client]-->|4:服务器用私钥解密,对比2个随机数|B[server]
ssh静态端口转发
端口转发就是隧道tunnel,ssh监听需要走隧道的端口,然后数据从ssh tunnel走。
举例比如http服务,如果在浏览器中配置socket代理,那么当你发起http请求的时候,将数据转发给你ssh指定监听的本地端口,比如1080,当1080收到来自http的数
据,然后会丢给ssh处理,ssh会将http的数据封装在ssh报文中,在ssh client和ssh server之间建立的连接中传递,然后ssh接收到这个报文解密后,转发此报文。
ssh server就是个代理的中转站。
端口转发两大功能:
加密client和server之间的通讯数据,一些telnet,ftp,http等明文传输的数据,可以封装在ssh协议的的载荷中。
能够突破防火墙的限制,建立一些无法建立的TCP连接。
-
选项
-L local_socket:remote_socket :指定本地ip和端口和对端ip和端口,ssh就会开一个本地端口来监听,当收到访问此端口的数据就通过隧道转发给ssh server,然后ssh server和remote_socket建立链接。 -R remote_socket:local_socket :指定对端ip和端口和本地ip和端口,
- 例子
ssh -L 127.0.0.1:9527:192.168.23.71:23
telnet 127.0.0.1 9527
graph LR
A[A主机]-->|A能ssh到B|C[B主机]
A[A主机]-->|A想telnet到C|D[C主机]
A[A主机]-->|禁止telnet访问|B[防火墙]
B[防火墙]-->C[B主机]
C[B主机]-->|B能telnet到C|D[C主机]
现在A想要telnet访问C主机,但是C主机上拒绝了A的访问,怎么办呢,这里就可以用到ssh端口转发的第二个功能,突破防火墙的限制,建立一些无法建立的连接
ssh动态端口转发
-
选项
-D [bind_address:]port:指定一个本地端口,然后ssh将做为一个socket服务器,支持sockets4和sockets5两种协议,这里就不需要指定http要访问的哪些网站的地址和端口,动态的从http请求里获取,然后ssh server解密后,代理其转发出去。
- 例子
![这里本来是要插入下,当我本地通过浏览器的socket代理访问网页时,在ssh server 产生的一些的,server 去和remote_socket建立的TCP链接,makedown语法不会]
配合端口转发使用的选项
- 选项
-N: 指定不执行远程命令,就是不打开远程的bash窗口,仅对端口转发有效 -f:指定ssh后台启用,
ssh 和sshd 配置文件
- ssh
/etc/ssh/ssh_config // ~/.ssh/config // ~/.ssh/know_hosts
- sshd
/etc/ssh/sshd_config /etc/ssh/shots.equiv /etc/ssh/ssh_known_hosts ~/.ssh/authorized_keys
安全日志信息
tail -f /var/log/secure
scp
scp 用来远程主机和本地主机之间的文件复制,但是有个问题就是scp并不检查文件是否变化,因此会产生不必要的带宽浪费,
- 语法:
scp [-12346BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file] [-l limit] [-o ssh_option] [-P port] [-S program] [[user@]host1:]file1 ... [[user@]host2:]file2
- 描述:
scp 基于ssh的一个远程主机之间的文件复制。看上面的格式也可以看出来,用户名可以不写,默认是当前用户,主机名或ip地址可以不写默认自己,文件名必须要写。主机名后面必须要加上:后面的文件名其实也可以不用写,默认是登陆用户的家目录。但是源文件总是要的。
- 选项
-q:quit,静默不显示 -r:Recursively,递归,默认只能复制普通文件,如果想要复制目录需要加-r选项,注意的是这里针对软连接复制过来的内容是软连接的源文件而不是源文件本身 -p:Preserves,保存文件的权限,修改时间和访问时间 -P:Port ,这里注意的是,因为-p给preserves用了,因此指定远程主机端口用大写的-P
- 例子
本地到远程
scp /etc host2:file
远程到本地
scp host2:file /etc
远程到远程
scp host1:file1 host1:file2 host2:/tmp
rsync
rsync 这个工具就解决了scp的问题,它主要用于主机之前的文件同步,如果文件属性没有变化,就不会同步。这样我想到了云盘的自动同步功能。
rsync 是由单独的软件包rsync提供的和openssh没有关系,但是它是承载在remote shell链接上的,默认是ssh,可以-e指定rsh等。
rsync 是个服务,getent services rsync 用873/tcp
rsync是非独立服务,需要安装xinetd软件包由xinetd服务代理。默认是关闭状态,不使用rsync daemon模式。
配置文件为/etc/rsyncd.conf
- 用法
Local: rsync [OPTION...] SRC... [DEST]
Access via remote shell:
Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST:DEST
Access via rsync daemon:
Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
Usages with just one SRC arg and no DEST arg will list the source files instead of copying.
- 描述
rsync 不支持2个远程主机之间的文件复制,src和dest都必须要有安装rsync
rsync 有2中传输模式,一种是通过remote shell(ssh或者rsh);一种是通过TCP直接链接到rsync daemon。如上所示,remote ssh 主机后为":"而daemon 主机后为"::"
-
选项
-a:--archive 归档 -b:--backup 备份 -r:--recursive 递归 -n:--dry-run 模拟 -v:--verbose 显示过程 -p:--perms 保留权限 -t:--times 保留时间戳 -g:--group 保留所有组 -o:--owner 保留所有者 -l:--links 只复制软链接本身 -L:复制软链接的源,
-
注意
复制文件时的格式如果最后为/,比如/etc/代表复制目录,/etc就是文件的意思
总之你能想到的cp之间那些事情,基本上rsync也能干,具体的man rsync - 例子
sftp
sftp 这个工具是基于ssh实现的ftp工具,也就是ssh转发了ftp包,sftp用法和ftp基本一样。其是一个交互式命令。
- 用法
sftp [-1Cv] [-B buffer_size] [-b batchfile] [-F ssh_config] [-o ssh_option] [-P sftp_server_path]
[-R num_requests] [-S program] [-s subsystem | sftp_server] host
sftp [user@]host[:file ...]
sftp [user@]host[:dir[/]]
sftp -b batchfile [user@]host
-
描述
- 选项
-b:batchfile ,直接执行file里的命令而不是通过交互式读取stdin,有些命令执行失败会中断sftp,可以在命令前加dash,如-get xxxx
- 交互式命令
登录后输入?或help即可知
2、pssh软件包
[http://code.google.com/p/parallel-ssh/]
pssh这个是用python编写的基于ssh和scp的并行工具软件包。
parellels
配置文件
库文件
/usr/lib/python2.7/site-packages/psshlib 目录下
二进制文件
/usr/bin/pssh|pscp.pssh|pnuke|pslurp|prsync
帮助文件
man pssh|pscp.pssh|pnuke|pslurp|prsync
pssh
- 用法
pssh [-vAiIP] [-h hosts_file] [-H [user@]host[:port]] [-l user] [-p par] [-o outdir] [-e errdir] [-t timeout]
[-O options] [-x args] [-X arg] command ...
pssh -I [-vAiIP] [-h hosts_file] [-H [user@]host[:port]] [-l user] [-p par] [-o outdir] [-e errdir] [-t time-
out] [-O options] [-x args] [-X arg] [command ...]
- 描述
parallels ssh program,在多个主机上并行执行ssh的一个工具。pssh有2个变量需要发给远程主机,因此远程主机的sshd_config配置文件中必须要有如下配置:
AcceptEnv PSSH_NODENUM PSSH_HOST
PSSH_NODENUM 表示每个ssh会话的编号从0开始,PSSH_HOST 表示host列表中的主机名
-
选项
-H:--host host_string 主机少的时候用"" 空格隔开多个主机 如host1 ,"host1 host2 host3" -h:--hosts host_file 主机多的时候,放置在hostfile文件中 格式如上:user@host:port -i:--inline 当每个主机命令完成后,显示stdout和stderr -o:--outdir 标准输出的存放目录,文件按照指定的host_socket命名 -e: --errdir 标准错误输出的存放目录,文件按照指定的host_socket命名 -p: --print 显示输出,功能有限,多个主机输出会交错 更多详情man pssh
- 例子
pssh -i -H "192.168.23.61 192.168.23.71" cd /home;pwd;ls
pssh -H 192.168.23.71 -o /tmp/stdout -e /tmp/stderr hostnamectl
pscp.pssh
pscp.pssh 用于并行将本地文件复制到远程主机
- 用法
pscp [-vAr] [-h hosts_file] [-H [user@]host[:port]] [-l user] [-p par] [-o outdir] [-e errdir] [-t timeout] [-O
options] [-x args] [-X arg] local remote
- 描述
将本地的local文件复制到多台主机上,命名为remote
- 选项
-a:--archive 归档,保留一些属性 -r:--recurvise 递归,复制目录时使用
pslurp
pslurp 用于并行复制远程主机文件到本地
- 用法
pslurp [-vAr] [-h hosts_file] [-H [user@]host[:port]] [-l user] [-p par] [-o outdir] [-e errdir] [-t timeout]
[-O options] [-x args] [-X arg] [-L localdir] remote local
- 描述
将远程多台主机上的remote文件复制到本地,命名为local
- 选项
-L:指定从远程主机下载到本机的存储的目录 -r:递归复制目录
prsync
- 用法
- 描述
和pscp一样的用法,和rsync一样的特性,不同的是并行在多台主机上执行
- 选项
-a:--archive 归档模式 -r:--recursive 递归
3、dropbear
dropbear 是ssh的另一种实现,因为其体积小,功能简单因此常用于嵌入设备中。