从python运行带有权限的shell脚本

cla*_*l3r 15 python linux git shell

我有一个最简单的脚本叫 update.sh

#!/bin/sh
cd /home/pi/circulation_of_circuits
git pull
Run Code Online (Sandbox Code Playgroud)

当我从终端呼叫这个时,./update.sh我得到了一个已经是最新的,或者像预期的那样更新文件.

我也有一个python脚本,在scipt里面是:

subprocess.call(['./update.sh'])

当我调用相同的脚本时,我得到:

权限被拒绝(publickey).致命:无法从远程存储库读取.

请确保您具有正确的访问权限并且存储库存在.

(我使用SSH).

-----------------更新--------------------

别人看了我一眼:

好的,所以有些进展.当我启动你的图像时,我无法在你的repo目录中运行git pull,而bash脚本也会失败.这似乎是因为bitbucket存储库是私有的,需要对pull进行身份验证(我使用的那个是公共的,这就是为什么我没有问题).大概是git在你第一次输入它之后记得这个,bash不知何故欺骗git认为你随后键入命令但是从python运行它是不一样的.

我不是一个git专家,但必须有一些方法来设置它,以便python可以提供身份验证.

jim*_*imh 11

听起来你需要给你的ssh命令一个它可以访问的公钥或私钥:

ssh -i /backup/home/user/.ssh/id_dsa user@unixserver1.nixcraft.com
Run Code Online (Sandbox Code Playgroud)

-i告诉它在哪里寻找密钥


小智 6

此问题是由git repo身份验证失败引起的.你说你正在使用SSH,git抱怨publickey auth失败.通常,您可以在私有仓库上使用git命令而无需输入密码.所有这些都意味着git正在使用ssh,但在后一种情况下它无法找到正确的私钥.

由于问题仅在通过另一个脚本运行时才会显现,因此很可能是由于环境变量混乱造成的.Subprocess.call应该按原样传递环境,因此有几个常见的嫌疑:

  1. 须藤.
    • 如果你使用sudo,它会将一个基本上空的环境传递给进程
  2. python脚本本身
    • 如果python脚本更改其env,那些更改也将传播到子进程.
  3. sh -l要么 su -
    • 这些命令设置了一个登录shell,这意味着它们的环境将重置为默认值.

任何这些原因都可能隐藏环境变量ssh-agent(或其他一些密钥管理工具)可能需要工作.

诊断和修复的步骤:

  1. 隔离问题.

    • 创建一个最小的python脚本,除了运行之外什么也不做subprocess.call(['./update.sh']).运行update.sh和新脚本.
  2. 诊断问题并相应地修复:

    a)如果update.sh工作,而新脚本没有,你可能会遇到一些奇怪的系统配置错误.尝试升级你的系统和python; 如果问题仍然存在,则可能需要对受影响的系统本身进行额外调试.

    b)如果update.sh和新脚本都有效,则问题在于调用shell脚本的外部python脚本.寻找的出现sudo,su -,sh -l,envos.environ,其中之一是最有可能的罪魁祸首.

    c)如果update.sh和新脚本都不起作用,那么您的问题很可能是ssh客户端配置; 一个典型的原因是你使用的是非默认身份,没有配置它,~/.ssh/config而是使用了ssh-add,之后,ssh-agent的缓存已过期.在这种情况下,运行ssh-add identityfile您用于对该git repo进行身份验证的身份,然后重试.


Joh*_*fis 3

我相信这个答案会对您有所帮助:https://serverfault.com/questions/497217/automate-git-pull-stuck-with-keychain ?answertab=votes#tab-top

我没有使用 ssh-agent 并且它有效:将您的脚本更改为以下脚本并尝试。

#!/bin/bash
cd /home/pi/circulation_of_circuits 
ssh-add /home/yourHomefolderName/.ssh/id_rsa
ssh-add -l
git pull
Run Code Online (Sandbox Code Playgroud)

这假设您已正确配置 ssh 密钥。