使用Fabric(Python)切换指定用户执行Linux命令遇权限问题
问题解决:Fabric sudo未切换到指定admin用户导致权限错误
问题根源
你的核心问题有两个:
- 重定向权限归属错误:单独执行
sudo echo ... > 文件时,>重定向操作是由当前登录用户的Shell处理的,而非sudo切换后的admin用户,因此即使echo以admin身份执行,重定向仍无目标文件的写入权限。 - Fabric sudo配置未完全生效:测试中文件所有者为当前用户,说明
sudo的用户切换逻辑未正确触发,可能是配置未被正确读取,或命令写法导致切换失效。
可行解决方案
方案1:将重定向纳入sudo执行的Shell命令内
把echo和重定向操作完整包裹在bash -c中,让admin用户的Shell处理整个流程,避免当前用户干预重定向:
# 注意转义双引号,避免Shell解析错误 connection.sudo(f"bash -c 'echo -e \"{updated_file}\" > /my/path/my_file.dat'", user='admin')
方案2:显式指定sudo的目标用户
即使配置了全局Config,也可以在sudo命令中显式指定user参数,确保切换到admin用户:
# 读取文件的正确写法(同样包裹在bash -c内) read_file = connection.sudo( "bash -c 'cd /my/path && cat my_file.dat'", user='admin', hide=True ) # 写入文件的正确写法 connection.sudo( f"bash -c 'echo -e \"{updated_file}\" > /my/path/my_file.dat'", user='admin' )
方案3:模拟手动su - admin的流程
完全复刻你手动操作的逻辑,用sudo调用su - admin执行完整命令:
connection.sudo(f"su - admin -c 'echo -e \"{updated_file}\" > /my/path/my_file.dat'")
验证方法
先执行whoami确认当前sudo的用户身份:
result = connection.sudo("whoami", user='admin') print(result.stdout.strip()) # 输出应为admin,说明切换成功
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

