https://www.jianshu.com/p/dd053c18e5ee
一、SRC、工作模型
ssh本身就是个工具,用来连接到指定的节点。免密就是自动输入密码,免密只跟用户名相关,跟ip、主机名、别名无关。
可以配置相同用户之间的免密,当然也可以配置不同用户之间的免密。
A节点用户a登录Bb,Aa在~/.ssh目录生成公钥和私钥,然后把公钥发送到Bb节点,然后Aa就可以免密登录Bb了。
==》a要免密登录b,就把a的公钥放在b上
公钥顾名思义,就是给别人的,
ssh免密、主机名、ip无关,因为ssh相当于自动输入指定用户的密码,只要用户名密码对,别的都不重要。
原先配好免密的,修改了主机名,也是可以免密的。
用户名不同:
如果我在node1上,使用用户ws登录,且我在node2和node3上均有用户ws,此时我登录只需使用:ssh node2即可登录node2主机,
如果我在node1上,使用用户ws登录,但是在node2和node3上并没有用户ws,但是有用户user1,此时使用ssh-copy-id node1将不会成功,此时应该使用ssh-copy-id usr1@node2。登录时使用ssh user1@node2
原理、模型
二、须知:
1. ssh连接是单向的, A能免密登录B, 并不能同时实现B能免密登录A
2. ssh跟ip、主机名无关,亲测,换了ip、主机名
之后,原来能免密的仍能免密。ssh只关心账号密码或者公私钥,只要这2个对了,谁都能连。公私钥只跟linux系统用户有关,跟密码无关。
亲测,在配置git时,生成公钥不需要输入密码,只需要生成公钥,推测认证只跟用户有关
四、多节点免密的流程
1. 切换到需要免密的用户,在任意目录下,执行ssh-keygen
误区:
- 不需要进入到
家目录的.ssh
目录,在任一目录下执行ssh-keygen,都会自动在家目录下创建.ssh
目录, - 不需要通过
ssh 自己
来创建.ssh
目录 - 手动创建.ssh当然也可以,但要注意权限 chmod 700
- ssh-keygen是生成公私钥,此时.ssh目录下只有这2个文件,pub是公,id_rsa是私。authorized_keys和known_hosts是之后ssh-copy-id和用主机名ssh登录时自动创建的
2. ssh-copy-id 对方用户@对方ip
会自动在对方用户家目录.ssh下创建authorized_keys目录,里面会记录别的节点发来的公钥,分为3段,第一段是加密类型,第二段是密文,第三段是用户@发送公钥时使用的名字,注意,这里虽然是主机名,但ip、别名也都是可以访问的,ip、别名、主机名配一个就行。
手动生成authorized_keys
authorized_keys必须是600或更小。
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh
注意:
- 自己也需要给自己配免密
- 是单向的
- 手动方式:
cat ~/.ssh/id_rsa.pub | ssh dest主机 destUser@destIP 'cat >> ~/.ssh/authorized_keys'
???
先把自己的公钥文件scp到对方节点,然后在对方节点使用cat + >> 追加到~/.ssh/authorized_keys
ssh后执行多条命令
大家平时有没有遇到自己连接云服务器,ssh 连接上去之后,发现自己的一些小工具用不了
例如go build无法使用 ,由于我们安装配置golang 环境的时候,是在文件/etc/profile中写了配置,因此需要source 一下/etc/profile
那么是否可以在ssh 连接上服务器的时候就可以立即自动执行这一类命令呢?
我们的智慧无穷无尽,小工具也是非常的多,今天来讲述一下SSH连接服务器后执行多条命令可以如何做
- 单条命令:ssh user@ip command1
- 多条命令:
ssh user@ip “command1;command2”
ssh user@ip “cmd1 && cmd2”
ssh user@ip “cmd1 || cmd2”
ssh user@ip “cmd1 && cmd2” 和 ssh user@ip “cmd1;cmd2” 还有 ssh user@ip "cmd1 || cmd2"的区别:
&&表示前面执行成功后执行后面的命令,||表示执行失败了执行后面的命令;“;”表示依次执行两条命令 - 要对$符号进行转义:
ssh user@ip “echo $PATH” 输出的是本机PATH值;
ssh user@ip “echo $PATH” 输出的是远端ip的PATH值。
1 使用分号隔开
使用 分号 ;来隔开命令
附带1条命令
ssh User@Host 'source /etc/profile'
附带多条命令
ssh User@Host 'source /etc/profile ; uptime'
2 使用管道符号隔开
使用管道|来隔开命令
附带1条命令
ssh User@Host 'source /etc/profile'
附带多条命令
ssh User@Host 'source /etc/profile | uptime'
3 使用写EOF的方式
同样适用于一条 / 多条命令
ssh User@Host << EOF
> ls -al
> source /etc/profile
> EOF
4 使用脚本的方式
使用脚本的方式花样就更多了,例如有一个脚本myinit.sh在/home/admin/code/ 下面
myinit.sh
#!/bin/bash
source /etc/profile
ls -al
远程连接服务器
ssh User@Host ‘bash -s’ < /home/admin/code/myinit.sh
————————————————
版权声明:本文为CSDN博主「阿兵云原生」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_37322399/article/details/126454798