ssh-agent ssh-add ok in user not in sudo
ssh-agent ssh-add ok in user not in sudo
我创建了一个 SSH 代理,以便在连接到我的服务器时向 ssh/scp cmd 提供我的密钥。
我还使用命令 'expect' 编写了一个 SSH-Add 脚本,以便在需要时写下我的释义。
这非常适合我的用户 "user"。
但我正在执行一个 python 脚本,该脚本使用 /dev/mem 需要通过 sudo 以 root 身份成为 运行。此 python 脚本调用另一个 bash 脚本,其中包含 ssh 和 scp cmd。
因此,所有这些 cmd 都以 root 身份执行,我的 agent/ssh-add 不再工作,不断询问每个文件的释义。
我该如何解决?我不想以 root 身份登录和 运行 代理以 root 身份登录。
我尝试了 sudo -u user 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
ssh user@server mkdir /home/repulsion/picsToAnimate/"" >/dev/null 2>&1
ssh user@server cp ""/* /home/repulsion/picsToAnimate/""/ >/dev/null 2>&1
for i in $( ls ); do
scp $i user@server:/home/repulsion/picsToAnimate/""/ >/dev/null 2>&1
done
您需要通过 sudo 传入 SSH 代理环境变量。
为此,您可以运行 sudo -E
通过sudo传递所有环境变量;但这可能很危险,因此最好只传递您需要的那些。执行此操作的最简单方法是 sudo
调用 env
以调用具有适当环境变量集的给定程序:
$ sudo env SSH_AGENT_PID=$SSH_AGENT_PID SSH_AUTH_SOCK=$SSH_AUTH_SOCK my-script
shh-agent 所需的环境变量已被 sudo 删除。请参阅 here 了解如何保留它们。
但是为什么你有一个 ssh-add 在那里为你输入密码而不是只有一个没有密码的 ssh 密钥?您可以使用
删除它
ssh-keygen -p [-P old_passphrase] [-N new_passphrase] [-f keyfile]
我创建了一个 SSH 代理,以便在连接到我的服务器时向 ssh/scp cmd 提供我的密钥。 我还使用命令 'expect' 编写了一个 SSH-Add 脚本,以便在需要时写下我的释义。
这非常适合我的用户 "user"。
但我正在执行一个 python 脚本,该脚本使用 /dev/mem 需要通过 sudo 以 root 身份成为 运行。此 python 脚本调用另一个 bash 脚本,其中包含 ssh 和 scp cmd。 因此,所有这些 cmd 都以 root 身份执行,我的 agent/ssh-add 不再工作,不断询问每个文件的释义。
我该如何解决?我不想以 root 身份登录和 运行 代理以 root 身份登录。 我尝试了 sudo -u user 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
ssh user@server mkdir /home/repulsion/picsToAnimate/"" >/dev/null 2>&1
ssh user@server cp ""/* /home/repulsion/picsToAnimate/""/ >/dev/null 2>&1
for i in $( ls ); do
scp $i user@server:/home/repulsion/picsToAnimate/""/ >/dev/null 2>&1
done
您需要通过 sudo 传入 SSH 代理环境变量。
为此,您可以运行 sudo -E
通过sudo传递所有环境变量;但这可能很危险,因此最好只传递您需要的那些。执行此操作的最简单方法是 sudo
调用 env
以调用具有适当环境变量集的给定程序:
$ sudo env SSH_AGENT_PID=$SSH_AGENT_PID SSH_AUTH_SOCK=$SSH_AUTH_SOCK my-script
shh-agent 所需的环境变量已被 sudo 删除。请参阅 here 了解如何保留它们。
但是为什么你有一个 ssh-add 在那里为你输入密码而不是只有一个没有密码的 ssh 密钥?您可以使用
删除它ssh-keygen -p [-P old_passphrase] [-N new_passphrase] [-f keyfile]