bashrc中exec执行sudo失败及保持sudo会话活跃问题求助
问题解答
1. 解决{*}执行失败的问题
你用{*}$cmd的写法完全不符合bash语法,这才导致命令找不到的错误。正确传递参数的方式根本不需要把命令拼接成字符串,直接用位置参数传递即可:
something(){ sudo "$@" }
如果确实需要构造命令集合,更安全的做法是用数组存储命令和参数,再执行:
something(){ cmd=(sudo "$@") "${cmd[@]}" }
2. 保持sudo会话活跃
sudo本身自带会话缓存机制,默认输入密码后15分钟内再次执行sudo无需重复验证。如果要延长缓存时长,可以通过修改sudoers文件调整:
# 必须用visudo编辑,避免语法错误导致sudo失效 visudo # 添加或修改以下配置,将超时时间改为30分钟(可自定义数值) Defaults timestamp_timeout=30
另外注意:绝对不能用exec执行普通sudo命令,因为exec会直接替换当前shell进程,命令执行完毕后进程就会退出,会话自然关闭。直接用sudo "$@"执行命令,结束后会回到原shell,同时sudo的缓存会话也会保留。
3. 在当前shell中使用exec执行sudo命令
首先明确:exec的核心作用就是用新进程替换当前shell进程,所以一旦执行exec sudo ...,原shell就会被sudo进程替代,命令结束后整个进程直接退出,会话必然关闭。不存在“用exec执行sudo后还保留原shell活跃”的可能。
如果非要用exec,只能让sudo启动一个交互式特权shell,这样进程不会直接退出:
exec sudo -i # 或者指定shell exec sudo bash
这种方式会把当前shell替换成sudo权限的交互式shell,你可以在这个特权环境下执行命令,退出该shell才会结束会话,但原shell已经被替换,并非保留原会话。
内容的提问来源于stack exchange,提问作者brodbeni
相关产品推荐
相关产品推荐

