问题描述
有这么一个场景:我需要使用 sudo 提权来执行一条命令,可能是打开一个常用的APP,或者是经常需要 pacman进行系统更新。那么,问题来了,由于这个APP我经常使用,而使用sudo时每次都需要输入密码,显然过于麻烦,那么,有没有什么办法可以自动填充密码呢?
嗯哼,办法是有的。
解决方案
目前找到两种解决方案,方案一亲测有效,方案二未试过,仅做记录。
方案一
有的应用自带选项,可以直接从标准输入读入数据,这时候只需要结合管道就好了。比如sudo的-S参数,以及passwdde -stdin参数。
举个例子,使用该方法运行netease-cloud-music。
使用 sudo 的 -S选项,结合shell 的输入重定向。比如,我每次都需要提权打开netease-cloud-music,那么我可以写这么一个脚本:
#!/usr/bash
# netease-cloud-music.sh
echo "your password" | sudo -S netease-cloud-music --force-device-scale-factor=2 --no-sandbox
然后赋予执行权限:sudo chmod +x netease-cloud-music.sh,然后再执行sh netease-cloud-music.sh即可,无需再次输入密码。
与快捷键绑定之后,每次只需要按下快捷键,他就能自动打开了,很方便。
方案二
这个办法涉及一个额外的应用叫做expect,在manajro上可以使用pacman来安装。expect就是用来做交互的,基本任何交互登录的场合都能使用,但是需要安装expect包。
语法如下:
#!/bin/expect
set timeout 30
spawn ssh -l jikuan.zjk 10.125.25.189
expect "password:"
send "zjk123\r"
interact
上述命令解释如下:
expect跟bash类似,使用时要先登录到expect,所以首行要指定使用expect
在运行脚本时候要expect file,不能sh file了
上面语句第一句是设定超时时间为30s,spawn是expect的语句,执行命令前都要加这句
expect "password:"这句意思是交互获取是否返回password:关键字,因为在执行ssh时会返回输入password的提示:jikuan.zjk@10.125.25.189’s password:
send就是将密码zjk123发送过去
interact代表执行完留在远程控制台,不加这句执行完后返回本地控制台

本文介绍了如何在需要sudo提权执行命令时避免频繁输入密码的两种方法。方案一是利用命令的参数结合管道自动输入数据,例如通过创建脚本配合sudo的-t选项。方案二是使用expect工具,它能模拟交互输入密码,但需要额外安装。这两种方法旨在提高日常操作的效率。
1万+

被折叠的 条评论
为什么被折叠?



