【问题标题】:ssh-agent ssh-add ok in user not in sudossh-agent ssh-add ok in user not in sudo
【发布时间】:2015-05-16 05:54:23
【问题描述】:

我创建了一个 SSH-Agent,以便在连接到我的服务器时向 ssh/scp cmd 提供我的密钥。 我还编写了一个带有“expect”命令的 SSH-Add 脚本,以便在需要时编写我的释义。

这与我的用户“用户”完美配合。

但我正在执行一个使用 /dev/mem 的 python 脚本,该脚本需要通过 sudo 以 root 身份运行。这个 python 脚本调用另一个 bash 脚本,里面有 ssh 和 scp cmd。 因此,所有这些 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

【问题讨论】:

  • 你能分享你的代码吗?您如何尝试调用 bash 脚本?
  • 刚刚使用我的代码进行了编辑。我可以每隔一分钟左右以 cron 的形式执行 bash 脚本作为用户...有更好的方法吗?

标签: python bash ssh


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 你是对的!我觉得有一个释义更安全,但无论如何,这一切看起来并不安全,不是吗?
    • @matthieumatthieu 在文件上设置密码通常更安全,然后在登录时使用keychain 之类的内容自动提示您并设置 SSH 代理。这样,如果你扔掉你的驱动器或类似的东西,有人无法提取无密码密钥;密钥仅在 SSH 代理实际运行时易受攻击。使用expect 提供密码并不安全,因为密码和密钥同时出现在同一个磁盘上。
    • 感谢您的信息,我不知道“钥匙串”的东西。但我正在做一个自动化,除了按下按钮之外没有键盘或用户交互......所以我什至不能写一次释义。理解为期望,也许我会选择一个解释更少的选项或 cron :(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-13
    • 2023-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多