在修改sudo免密的时候,需要修改sudoers文件;记录一下sed对于空格和tab键位的匹配,不能使用4个空格替代tab键;

添加免密用户和组

# 匹配目标,在这一行下面插入一行
root    ALL=(ALL)       ALL
# 添加单个用户
sudo sed -i '/root\tALL/a\username\tALL=(ALL)\tNOPASSWD:ALL' /etc/sudoers
# 如果要是不远程ssh执行命令,则到这就可以了;否则只添加单个用户还不够,还要添加这个用户的组;如果有多个用户,可以指定一个组添加进去
sudo sed -i '/\# \%wheel\tALL/a\username\tALL=(ALL)\tNOPASSWD:ALL' /etc/sudoers

使用\t来匹配tab键

ssh执行远程命令

ssh username@ip/hostname "sudo yum update -y; ls; pwd"
# 多个命令用分号隔开
# 如果没有把username的组添加到sudo免密,会出现如下错误提示
sudo: 没有终端存在,且未指定 askpass 程序

ssh远程命令格式使用双引号 "ls" 把命令阔起来,如果使用 echo -e "hellow\nworld" 的时候echo内的换行符\n\会被当成转义符,只输出字母n,此时需要给echo的冒号添加转义符,然后在echo内使用换行符就能正常输出了,即如下示例

ssh username@ip "echo -e \"hello\nworld\" >> ./a.txt

交互命令

有时候需要执行的命令需要交互,默认情况,本地shell发送完命令之后就退出了,当有交互命令的时候shell已经退出了,所以就失败了,这时在ssh的后面添加一个选项-t即可;这个选项也可以用于sudo没有设置免密的情况,用来输入sudo密码

ssh -t username@ip "sudo yum update -y"

扩展

对于复杂或者批量的情况,可以使用sshpass来指定密码文件、忽略指纹确认等更多的选项;
或者使用expect来自动应答一些问题

参考资料

https://www.cnblogs.com/sparkdev/p/6842805.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注

10 − 1 =