如何将复杂系统命令适配到Python的subprocess.run()
解决subprocess.run执行sudo su命令的参数拆分问题
核心问题是subprocess.run的列表参数拆分错误:
- 不能把
su - otherUser合并成一个参数,sudo会把它当成完整命令名查找,自然找不到 - 给
-c后面的scp命令加转义引号完全没必要,subprocess不需要shell解析引号,引号会被当成命令的一部分传递
正确的参数拆分方式
把每个命令、选项、参数都拆成单独的列表元素:
import subprocess def main(): subprocess.run(["ls", "-l"]) # 测试用 print("===================================================================================") # 正确拆分每个参数:su是命令,-是选项,otherUser是目标用户,-c后面直接传scp命令 cmd = [ "sudo", "su", "-", "otherUser", "-c", "scp -P 1234 otherUser@10.10.10.10:/path/to/file/x.txt /tmp/x.txt" ] print(cmd) # 查看命令 subprocess.run(cmd) if __name__ == "__main__": main()
拆分逻辑说明
sudo:触发权限提升的命令su:sudo要执行的子命令-:su的选项,用于模拟目标用户的完整登录环境(加载用户profile等)otherUser:su的目标用户名-c:su的选项,指定要执行的命令字符串- 最后一个元素:直接传递完整的scp命令,不需要加引号,subprocess会把它作为
-c的参数完整传给su
原写法出错原因
["sudo", "su - otherUser", ...]:sudo会尝试执行名为su - otherUser的命令,而非执行su并传递- otherUser参数,因此报错「command not found」- 给scp命令加的
\"...\"会被当作命令的一部分,su执行时会试图寻找带引号的命令,同样会引发错误
内容的提问来源于stack exchange,提问作者Pete
相关产品推荐
相关产品推荐

