| SSH是一个安全协议,在进行数据传输时,会对数据包进行加密处理,加密后在进行数据传输。确保了数据传输安全。那SSH服务主要功能有哪些呢? |
| 1.提供远程连接服务器的服务 |
| 1)linux远程连接协议: ssh服务 端口22 |
| 2)windows远程连接: RDP协议 端口3389 |
| 2.对传输的数据进行加密 |
| |
| ssh 22 |
| telnet 23 |
| http 80 |
| https 443 |
| ftp 20 21 |
| RDP 3389 |
| mysql 3306 |
| redis 6379 |
| zabbix 10050 10051 |
| elasticsearch 9200 9300 |
| rsync 873 |
| rpcbind 111 |
强调:用ssh或者与scp相关的命令时,会产生登录shell,加载下面相关配置文件,切记这些配置文件中不能有任何会产生输出的指令
| |
| /etc/profile |
| /etc/profile.d/*.sh |
| /etc/bashrc |
| |
| |
| ~/.bash_profile |
| ~/.bashrc |
原因剖析
| 想象一下scp的工作过程。当你运行此命令复制文件时, |
| scp会启动一次ssh会话,然后在这个会话中发送一些精确的命令以读取远程主机上指定路径的文件内容。 |
| 如果此时echo命令在bashrc中被触发,并把一些额外的输出写入到ssh会话中, |
| scp就无法正确地解析它期望的文件内容了,从而导致命令失败。 |
| |
| 在正常情况下,你应该避免在bashrc文件中添加会生成输出的命令,以避免干扰scp或其他依赖ssh的命令的执行。如果你确实需要在bashrc文件中添加echo或类似的命令,一个比较好的做法可能是检查当前会话是否为一个交互式会话,只在交互式会话中执行这些命令。你可以参考以下的bash语句: |
| bash |
| if [ "$PS1" ]; then |
| echo "This is an interactive session." |
| fi |
| 在这个例子中,$PS1环境变量通常在交互式bash会话中被设置,所以你可以使用它来检测当前会话是否为交互式。类似的,你可以把你的echo命令放在这样的条件判断语句中,以避免在非交互式会话(比如scp和ssh命令)中执行它们。 |
| 1.安装 |
| [root@web01 ~] |
| |
| 2.启动 |
| [root@web01 ~] |
| |
| 3.创建普通用户并设置密码 |
| [root@web01 ~] |
| [root@web01 ~] |
| |
| 4.测试连接 |
| [C:\~]$ telnet 10.0.0.7 23 |
| Connecting to 10.0.0.7:23... |
| Connection established. |
| To escape to local shell, press 'Ctrl+Alt+]'. |
| |
| Kernel 3.10.0-957.el7.x86_64 on an x86_64 |
| web01 login: lhd |
| Password: 123456 |
| [lhd@web01 ~]$ |
| telnet: |
| 1.不支持root用户登录,只允许普通用户登录 |
| 2.数据传输过程中明文的 |
| |
| ssh: |
| 1.支持root用户登录 |
| 2.数据传输过程中时加密码 |
| SSH有客户端与服务端,我们将这种模式称为C/S架构,ssh客户端支持Windows、Linux、Mac等平台。 |
| 在ssh客户端中包含 ssh|slogin远程登陆、scp远程拷贝、sftp文件传输、ssh-copy-id秘钥分发等应用程序 |
| [root@web01 ~] |
| |
| |
| ssh |
| root |
| |
| @ |
| 172.16.1.31 |
| -p |
| 22 |
| -o StrictHostKeyChecking=no |
| 1.查看网络 |
| ping 10.0.0.31 |
| 2.查网卡,网卡是否启动 |
| 3.查端口 |
| telnet 10.0.0.31 22 |
| 4.检查sshd服务是否启动 |
| 5.防火墙 |
| 6.虚拟机的虚拟网络编辑器 |
| 7.查看windows的网卡 |
| 类似于rsync命令,远程拷贝,scp时全量,rsync时增量 |
| scp 也支持推和拉 |
| |
| [root@web01 ~] |
| root@172.16.1.31's password: 1 |
| rewriteip.sh 100% 194 116.3KB/s 00:00 |
| |
| #推送目录到远端服务器 |
| [root@web01 ~]# scp -r /etc root@172.16.1.31:/tmp/ |
| |
| #注意: |
| 1.与rsync不同,推送时不论加 / 或者不加,推送的都是目录 |
| 2.如果想推送目录下的文件加 * |
| [root@web01 ~]# scp -r /etc/* root@172.16.1.31:/tmp/ |
| |
| #命令拆分: |
| scp #命令 |
| rewriteip.sh #要推送的文件或目录 |
| root #远程主机上的系统用户 |
| @ #分隔符 |
| 172.16.1.31 #远端主机的IP地址 |
| :/tmp/ #远端主机保存文件的位置 |
| [root@web01 ~] |
| |
| |
| 1.与rsync不同,推送时不论加 / 或者不加,拉取的都是目录 |
| 2.如果想拉取目录下的文件加 * |
| -P 指定端口,默认22端口可不写 |
| -r 表示递归拷贝目录 |
| -p 表示在拷贝文件前后保持文件或目录属性不变 |
| -l 限制传输使用带宽(默认kb) |
| |
| |
| [root@m01 ~] |
| |
| |
| [root@m01 ~] |
| |
| |
| [root@m01 ~] |
| root@172.16.1.31 password: |
| test 100% 656MB '83.9MB/s' 00:07 |
| |
| |
| [root@m01 ~] |
| root@172.16.1.31s password: |
| test 7% 48MB '1.0MB/s' 09:45 |
| 1.scp通过ssh协议加密方式进行文件或目录拷贝。 |
| 2.scp连接时的用户作为为拷贝文件或目录的权限。 |
| 3.scp支持数据推送和拉取,每次都是全量拷贝,效率较低。 |
| 1.终端连接 |
| [C:\~]$ sftp 10.0.0.31 |
| |
| 2.下载文件 |
| sftp:/data> get 2_nfs.jpg |
| Fetching /data/2_nfs.jpg to 2_nfs.jpg |
| sftp: received 29.7 KB in 0.03 seconds |
| |
| 3.上传文件 |
| sftp:/data> put |
| |
| 1.连接 |
| [root@web01 ~] |
| root@172.16.1.31's password: |
| Connected to 172.16.1.31. |
| sftp> |
| |
| 2.操作远程主机 |
| sftp> pwd |
| Remote working directory: /root |
| sftp> cd /data |
| sftp> pwd |
| Remote working directory: /data |
| sftp> ls |
| 2_nfs.jpg |
| sftp> ls -l |
| -rw-r--r-- 1 www www 30419 Nov 23 18:17 2_nfs.jpg |
| |
| 3.操作本机(在命令前面加一个 l ,表示localhost) |
| sftp> lls -l |
| total 8 |
| -rw-------. 1 root root 1588 Nov 17 12:11 anaconda-ks.cfg |
| drwxr-xr-x. 2 root root 6 Nov 18 09:02 dir1 |
| drwxr-xr-x. 2 root root 6 Nov 18 09:02 dir2 |
| -rw-r--r--. 1 root root 194 Nov 17 12:29 rewriteip.sh |
| |
| 4.拉取命令 |
| sftp> get 2_nfs.jpg |
| Fetching /data/2_nfs.jpg to 2_nfs.jpg |
| /data/2_nfs.jpg 100% 30KB 3.1MB/s 00:00 |
| sftp> lls -l |
| total 40 |
| -rw-r--r--. 1 root root 30419 Nov 24 10:22 2_nfs.jpg |
| |
| #指定目录拉取 |
| sftp> get 2_nfs.jpg /opt |
| Fetching /data/2_nfs.jpg to /opt/2_nfs.jpg |
| /data/2_nfs.jpg 100% 30KB 10.9MB/s 00:00 |
| sftp> lls -l /opt |
| total 32 |
| -rw-r--r--. 1 root root 30419 Nov 24 10:22 2_nfs.jpg |
| |
| 5.推送命令 |
| sftp> put 2_nfs.jpg |
| Uploading 2_nfs.jpg to /data/2_nfs.jpg |
| 2_nfs.jpg |
| 1.xftp |
| 2.filezilla |
| 3.flashfxp |
| 1.sz/rz |
| 1)不能上传大于4G的文件 |
| 2)不能断点续传 |
| 3)不能上传文件夹 |
| |
| 2.sftp |
| 1)能上传大于4G的文件 |
| 2)支持断点续传 |
| 3)可以上传文件夹 |
| |
| [root@web01 ~] |
| root@172.16.1.31's password: 1 |
| Last login: Tue Nov 24 09:57:59 2020 from 10.0.0.1 |
| |
| #设置密码 |
| 1.如果太难,会记不住 |
| 2.如果太简单,容易破解 |
| 3.每台服务器密码不一样 |
| 4.密码是动态的 |
| 5.密码三个月一修改 |
| 6.密码错误三次锁定用户 |
| 7.密码是没有规律的 |
| 默认情况下,通过ssh客户端命令登陆远程服务器,需要提供远程系统上的帐号与密码,但为了降低密码泄露的机率和提高登陆的方便性,建议使用密钥验证方式。 |
| [root@m01 ~] |
| Generating public/private rsa key pair. |
| Enter file in which to save the key (/root/.ssh/id_rsa): |
| Created directory '/root/.ssh'. |
| Enter passphrase (empty for no passphrase): |
| Enter same passphrase again: |
| Your identification has been saved in /root/.ssh/id_rsa. |
| Your public key has been saved in /root/.ssh/id_rsa.pub. |
| The key fingerprint is: |
| SHA256:OKxLhAZ0qD/LXHzGUByirfRI5k1YRCCMT8lK8sLIk10 root@m01 |
| The key's randomart image is: |
| +---[RSA 2048]----+ |
| |+oo*=... | |
| |+=== Eo | |
| |O=O +. | |
| |=@oO.. . | |
| | oB.+o+ S | |
| | .o.o.+. | |
| | o +oo | |
| | +. . | |
| | . | |
| +----[SHA256]-----+ |
| |
| 1.查看公钥 |
| [root@m01 ~] |
| |
| 2.在其他服务器创建文件,将内容粘贴进去 |
| [root@nfs ~] |
| [root@nfs ~] |
| |
| 3.授权文件 |
| [root@nfs ~] |
| [root@nfs ~] |
| |
| 4.测试连接 |
| |
| [root@m01 ~] |
| The authenticity of host '172.16.1.31 (172.16.1.31)' can't be established. |
| ECDSA key fingerprint is SHA256:sYhpMuszVGaHSeWKyLXMGQQ72f/6KxyExWabnY/cz6w. |
| ECDSA key fingerprint is MD5:bc:9c:0b:45:b5:27:71:cd:da:02:68:c0:48:71:9d:69. |
| Are you sure you want to continue connecting (yes/no)? yes |
| Warning: Permanently added '172.16.1.31' (ECDSA) to the list of known hosts. |
| Last login: Tue Nov 24 10:37:03 2020 from 172.16.1.7 |
| [root@nfs ~]# |
| |
| #再一次连接 |
| [root@m01 ~]# ssh 172.16.1.31 |
| Last login: Tue Nov 24 11:00:39 2020 from 172.16.1.61 |
| [root@nfs ~]# |
| |
| [root@m01 ~] |
| /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: ".ssh/id_rsa.pub" |
| /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed |
| /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys |
| root@172.16.1.7's password: |
| |
| Number of key(s) added: 1 |
| |
| Now try logging into the machine, with: "ssh 'root@172.16.1.7'" |
| and check to make sure that only the key(s) you wanted were added. |
| |
| [root@m01 ~]# |
| |
| #连接测试 |
| [root@m01 ~]# ssh 172.16.1.7 |
| Last login: Tue Nov 24 09:02:26 2020 from 10.0.0.1 |
| [root@web01 ~]# |
| 实践场景,用户通过Windows/MAC/Linux客户端连接跳板机免密码登录,跳板机连接后端无外网的Linux主机实现免密登录 |
| 实践多用户登陆一台跳板机免密码 |
| 实践跳板机登陆多台服务器免密码 |
| 1.打开powershell |
| 2.执行ssh-keygen |
| 3.windows下找到公钥 C:\Users\Administrator.DESKTOP-7PQVV6E\.ssh\id_rsa.pub |
| 4.将公钥内容复制到 m01 跳板机上 |
| [root@m01 ~] |
| [root@m01 ~] |
| 1.打开xshell,工具栏中的工具,点击新建用户密钥 |
| 2.选择加密文件类型和位数,下一步 |
| 3.生成密钥对成功,下一步 |
| 4.给密钥配置信息,名字,密码...,完成 |
| |
| 5.密钥属性或者工具栏用户密钥管理者 |
| 6.选择密钥对,点击属性,查看公钥 |
| 7.将公钥内容复制到 m01 跳板机上 |
| [root@m01 ~] |
| [root@m01 ~] |
| 8.连接时使用密钥连接 |
| |
| [root@m01 ~] |
| |
| |
| for i in 31 41 |
| do |
| echo "#########172.16.1.$i#####" |
| ssh root@172.16.1.$i "$1" |
| done |
| [root@m01 ~] |
| |
| |
| lb01=10.0.0.5 |
| lb02=10.0.0.6 |
| web01=10.0.0.7 |
| web02=10.0.0.8 |
| web03=10.0.0.9 |
| nfs=10.0.0.31 |
| backup=10.0.0.41 |
| db01=10.0.0.51 |
| m01=10.0.0.61 |
| zabbix=10.0.0.71 |
| |
| menu(){ |
| cat <<-EOF |
| +-------------------------+ |
| | 1) lb01 | |
| | 2) lb02 | |
| | 3) web01 | |
| | 4) web02 | |
| | 5) web03 | |
| | 6) nfs | |
| | 7) backup | |
| | 8) db01 | |
| | 9) m01 | |
| | 10) zabbix | |
| | h) help | |
| +-------------------------+ |
| EOF |
| } |
| |
| menu |
| |
| |
| connect(){ |
| ping -c 1 -w 1 $1 &>/dev/null |
| if [ $? -eq 0 ];then |
| ssh root@$1 |
| else |
| echo -e "\033[5;4;40;31m 别连了,我的哥,$2:$1机器都没开!!!\033[0m" |
| fi |
| } |
| |
| |
| trap "" HUP INT TSTP |
| while true |
| do |
| read -p "请输入要连接的主机编号:" num |
| case $num in |
| 1|lb01) |
| connect $lb01 lb01 |
| ;; |
| 2|lb02) |
| connect $lb02 lb02 |
| ;; |
| 3|web01) |
| connect $web01 web01 |
| ;; |
| 4|web02) |
| connect $web02 web02 |
| ;; |
| 5|web03) |
| connect $web03 web03 |
| ;; |
| 6|nfs) |
| connect $nfs nfs |
| ;; |
| 7|backup) |
| connect $backup backup |
| ;; |
| 8|db01) |
| connect $db01 db01 |
| ;; |
| 9|m01) |
| connect $m01 m01 |
| ;; |
| 10|zabbix) |
| connect $zabbix zabbix |
| ;; |
| h|help) |
| clear |
| menu |
| ;; |
| 求求你放过我) |
| break |
| ;; |
| esac |
| done |
| |
| 1.更改远程连接登陆的端口 |
| 2.禁止ROOT管理员直接登录 |
| 3.密码认证方式改为密钥认证 |
| 4.重要服务不使用公网IP地址 |
| 5.使用防火墙限制来源IP地址 |
| [root@m01 ~] |
| |
| set ip 10.0.0.51 |
| set pass 123456 |
| set timeout 30 |
| spawn ssh root@$ip |
| expect { |
| "(yes/no)" {send "yes\r"; exp_continue} |
| "password:" {send "$pass\r"} |
| } |
| expect "root@*" {send "df -h\r"} |
| expect "root@*" {send "exit\r"} |
| expect eof |
| [root@m01 ~] |
| |
| [option] |
| -p:指定密码 |
| -f:从文件中取密码 |
| -e:从环境变量中取密码 |
| -P:设置密码提示 |
| 1.m01做ssh安全优化 |
| 2.m01免密连接其他所有服务器 |
| 3.除了web服务器其他机器关闭外网连接 |