sudo 自动输入密码的脚本 alias别名

sh/bash/dash/ksh/zsh等Shell脚本
回复
xhd2015
帖子: 6
注册时间: 2015-05-23 11:22
系统: ubuntu 14.04

sudo 自动输入密码的脚本 alias别名

#1

帖子 xhd2015 » 2015-05-23 14:36

【前言】
废话不多说,本贴内容讲述如何自动应答sudo需要输入的密码,同时作为alias的一个小小应用

【alias简介】
alias 命令用于定义一个命令的简写格式,例如,alias lsproc='ls -l /proc',其中定义了一个新的命令lsproc,以后当输入lsproc的时候,都会执行ls -l proc,显示proc的目录内容
为了使alias永久生效,可以将定义写在 ~/.bashrc 中
vim ~/.bashrc
添加:alias lsproc='ls -l /proc'
编辑完~/.bashrc文件以后,重启控制台,输入alias<Enter>,即可看到刚才定时的别名,输入lsproc即可得到结果

注:~表示用户的/home/usrname目录;alias的意思是别名

【正文】
之前每次关机都需要遵循以下步骤:
ubuntu@x:sudo -i #获取权限
[sudo]password for x: #提示输入密码
root@x:shutdown -h now #获取完权限,执行关机,个人喜欢用shutdown而不是halt

或者合成一句:
ubuntu@x:sudo shutdown -h now
[sudo]password for x:
root@x:(关机)

为了方便,我想起了alias,于是编写了下面的alias别名,看能不能自动应答,做到一键关机:
ubuntu@x:echo 123123|sudo shutdown -h now' #123123 是我的系统密码;定义halt别名会覆盖原来的halt,要引用原来系统的halt,只需加一个用\halt即可
ubuntu@x:halt
[sudo]password for x: #结果仍然出现密码要求,显然没有自动应答

于是网上各种搜,誓要把这个问题解决,过程中包括下面这些命令,但是都不行
alias halt='echo 123123|sudo shutdown -h now'
alias halt='echo 123123>stdin;sudo -S shutdown -h now' #sudo -S表示从标准stdin,也就是键盘输入

直到后来,千辛万苦之下,终于解决了这个问题,其中需要用到重定向符号<,>,2>等,[url]http:www.2cto.com/os/201403/284912.html 可以看看重定向相关介绍

【最终解决方法】(以自动应答sudo -i为例,此命令的作用是申请root权限)
第一步:为了避免直接使用明文密码,首先定义一个系统环境变量PASS=123123
ubuntu@x:vim /etc/profile
#在/etc/profile中添加:
# export PASS=‘123123’
# 保存,exit
ubuntu@x:source /etc/profile #使之生效
ubuntu@x:export #查看
新建好之后,就可以用${PASS}来引用

第二步:编写应答指令,这一步是纯粹是实验得出的
新建一个pass文件,里面写入密码内容 123123,保存,exit

ubuntu@x:sudo -S -i<pass #输入这个命令,会出现以下提示信息:
[sudo] password for x: stdin: is not a tty #[sudo] password for x: 标准输入sdin不是一个tty(控制台终端)(基于下面的理由,你可以不用理会这条信息)
ubuntu@x:sudo -i #但其实这时候你已经获得了权限,输入sudo -i就可以获得权限,到这一步,其实我们已经完成了大半工作,即本质上已经实现了自动应答,但是还需要进一步优化,做到一步到位
root@x: #证明已经获取了root权限

优化如下:
避免输出错误提示信息:
sudo -S 2> /dev/nul # 2>表示stderr的重定向,/dev/null是一个特殊的输出设备,它会舍弃一切指向它的输入

用echo来自动建立文件
echo ${PASS}>/tmp/pass #${PASS}就是上面的密码,123123; > /tmp/pass 表示输出重定向/tmp/pass文件,/tmp是一个临时文件夹

用分号(;)来一步完成
echo ${PASS}>/tmp/pass ; sudo -S -i</tmp/pass 2>/dev/null ; sudo -S -i #注意为什么两次sudo(第二次在第一次的基础上真正得到权限)

用alias简化命令格式:
alias su='echo ${PASS}>/tmp/pass ; sudo -S -i</tmp/pass 2>/dev/null ; sudo -S -i‘ #新的su替代原来的su,原来的su用\su访问

最后,加入~/.bashrc使之永久生效
测试以下:
ubuntu@x:su
root@x: #干净利落地获得了系统权限


【晒晒自动应答命令】
#su,reboot,halt
alias su=' echo ${PASS} > /tmp/pass ; sudo -i -S < /tmp/pass 2> /dev/null ; sudo -i -S'
alias reboot=' echo ${PASS} > /tmp/pass ; sudo -i -S< /tmp/pass 2> /dev/null ; sudo -S reboot'
alias halt=' echo ${PASS} > /tmp/pass ; sudo -i -S< /tmp/pass 2> /dev/null ; sudo -S shutdow -h now'

【声明】
引用请声明来源,谢谢。

所用系统是:ubuntu-64bit 14.10
头像
astolia
论坛版主
帖子: 6444
注册时间: 2008-09-18 13:11

Re: sudo 自动输入密码的脚本 alias别名

#2

帖子 astolia » 2015-05-23 17:30

如果仅仅是不想让sudo询问密码,直接在/etc/sudoers里加一行

代码: 全选

用户名 ALL=(ALL) NOPASSWD: ALL
就行了,也可以仅仅对某些程序不询问密码

代码: 全选

用户名 ALL=(ALL) NOPASSWD: /sbin/shutdown
另外也有不需要root权限就可以关机的方法

代码: 全选

dbus-send --print-reply --system --dest=org.freedesktop.login1 /org/freedesktop/login1 org.freedesktop.login1.Manager.PowerOff boolean:false
头像
tracyone
帖子: 866
注册时间: 2010-11-19 14:25
系统: 乌班图
来自: onetracy.com
联系:

Re: sudo 自动输入密码的脚本 alias别名

#3

帖子 tracyone » 2015-05-24 10:17

在15.04之前我的做法是这样...加入suid位,普通用户获得该二进制所拥有用户的权限。

代码: 全选

sudo chmod u+s $(which shutdown )
不过现在15.04不行了...因为发现shutdown程序指向了systemctl程序...这样做导致systemctl无法正常工作。
4apple
帖子: 1
注册时间: 2015-11-24 17:13

Re: sudo 自动输入密码的脚本 alias别名

#4

帖子 4apple » 2015-11-24 17:15

在Ubuntu 12.04上实验成功,感谢楼主~~
回复