You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Fabric(Python)切换指定用户执行Linux命令遇权限问题

问题解决:Fabric sudo未切换到指定admin用户导致权限错误

问题根源

你的核心问题有两个:

  1. 重定向权限归属错误:单独执行sudo echo ... > 文件时,>重定向操作是由当前登录用户的Shell处理的,而非sudo切换后的admin用户,因此即使echo以admin身份执行,重定向仍无目标文件的写入权限。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 19:19:51