我有一个 Python 脚本,需要在 sudo 模式下运行,并且还应该运行一些 git 命令(其中包括克隆和推送)。这些命令无法连接到服务器,因为它们以 root 身份运行,因此不使用我的普通用户 ssh 密钥。
到目前为止,这是一个常见问题,但问题是我已经在尝试在调用这些命令之前将用户降级。我用了:
def bash_background_demoted(cmd_list):
def _demote():
if getuid() == 0:
user = getenv('SUDO_USER')
else:
user = getenv('USER')
uid, gid = pwd.getpwnam(user)[2:4]
setegid(gid)
seteuid(uid)
process = Popen(cmd_list, stdout = PIPE, stderr = PIPE, preexec_fn = _demote)
outp, err = process.communicate()
print outp + err
此方法似乎适用于其他命令,但不适用于 git:
bash_background_demoted(['whoami'])
# mark
bash_background_demoted(['git', 'clone', 'ssh://git@bitbucket.org/stuff', '/repo/dir/'])
# Permission denied (publickey).
# fatal: The remote end hung up unexpectedly
如果我不以 sudo 身份运行,它确实可以工作(但其他部分会损坏,所以这不是一个可接受的解决方案)。
推送不存在 -i [keyfile] 参数。有人知道解决方案吗?可能是一些微不足道的事情,但我被困住了......
编辑: HOME 环境变量在主进程和子进程中设置正确。USER 设置不正确,但设置它不会改变错误。
EDIT2: 我已经验证它确实是导致问题的关键。我将我的复制到 /root/.ssh/ 并且错误消失了。虽然不是一个好的解决方案。
(该解决方案只需要在最新版本的 Python 2 中的 Ubuntu 上运行)