ssh-agent ssh-add ok in user not in sudo

时间:2015-03-13 16:37:43

标签: python bash ssh

我创建了一个SSH-Agent,以便在连接到我的服务器时为ssh / scp cmd提供密钥。 我还使用命令' expect'编写了一个SSH-Add脚本。在需要时写下我的意译。

这完全适合我的用户"用户"。

但是我正在执行一个使用/ dev / mem的python脚本,需要通过sudo以root身份运行。这个python脚本用ssh和scp cmd调用另一个bash脚本。 因此,所有这些cmd都以root身份执行,我的agent / ssh-add不再起作用,不断询问每个文件的释义。

我怎么能解决这个问题?我不想以root身份登录并以root身份运行代理。 我尝试了sudo -u用户ssh,但它没有工作(即:需要输入我的释义)

有什么想法吗?

提前致谢, 垫

编辑:我的代码: 需要sudo的py脚本

#!/usr/bin/env python2.7
import RPi.GPIO as GPIO
import time
import subprocess
from subprocess import call
from datetime import datetime
import picamera
import os
import sys
GPIO.setmode(GPIO.BCM)
# GPIO 23 set up as input. It is pulled up to stop false signals
GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD_UP)

#set path and time to create the folder where the images will be saved
pathtoscript = "/home/pi/python-scripts"

current_time = time.localtime()[0:6]
dirfmt = "%4d-%02d-%02d-%02d-%02d-%02d"
dirpath = os.path.join(pathtoscript , dirfmt)
localdirname = dirpath % current_time[0:6] #dirname created with date and time
remotedirname = dirfmt % current_time[0:6] #remote-dirname created with date and time
os.mkdir(localdirname) #mkdir
pictureName = localdirname + "/image%02d.jpg" #path+name of pictures
var = 1
while var == 1:
    try:
            GPIO.wait_for_edge(23, GPIO.FALLING)
            with picamera.PiCamera() as camera:
                    #camera.capture_sequence(["/home/pi/python-scripts/'dirname'/image%02d.jpg" % i for i in range(2)])
                    camera.capture_sequence([pictureName % i for i in range(19)])
                    camera.close()
                    cmd = '/home/pi/python-scripts/picturesToServer {0}  &'.format(remotedirname)
                    call ([cmd], shell=True)
    except KeyboardInterrupt:
            GPIO.cleanup()       # clean up GPIO on CTRL+C exit
GPIO.cleanup()           # clean up GPIO on normal exit

bash脚本:

#!/bin/bash
cd $1
ssh user@server mkdir /home/repulsion/picsToAnimate/"$1" >/dev/null 2>&1
ssh user@server cp "$1"/* /home/repulsion/picsToAnimate/"$1"/ >/dev/null 2>&1
for i in $( ls ); do
    scp $i user@server:/home/repulsion/picsToAnimate/"$1"/  >/dev/null 2>&1
done

2 个答案:

答案 0 :(得分:1)

您需要通过sudo传递SSH代理环境变量。

为此,您可以运行sudo -E以通过sudo传递所有环境变量;但这可能很危险,所以最好只传递你需要的那些。最简单的方法是sudo调用env来调用给定的程序,并设置适当的环境变量:

$ sudo env SSH_AGENT_PID=$SSH_AGENT_PID SSH_AUTH_SOCK=$SSH_AUTH_SOCK my-script

答案 1 :(得分:1)

sudo删除了shh-agent所需的环境变量。请参阅here了解如何保留它们。

但为什么你有一个ssh-add那里输入密码短语你只是有一个没有密码短语的ssh密钥?您可以使用

删除它
ssh-keygen -p [-P old_passphrase] [-N new_passphrase] [-f keyfile]