Python脚本不通过调用实用程序来处理lftp和sftp

2024-04-25 01:21:19 发布

您现在位置:Python中文网/ 问答频道 /正文

Python脚本部分:

    try:
        print('Enter remote FTP user password:')
        self.sudo_call(['lftp','sftp://{}@{}'.format(username, address),'-e','"put','/home/rfts/.ssh/id_rsa.pub"'],
        user='rfts',
        stderr=subprocess.STDOUT)
    except subprocess.CalledProcessError as ex:
        output = ex.output.decode('utf-8')
        raise Exception('Could not copy public key to remote user: '
                        '{}'.format(output))

运行时,它在/var/log/secure中创建

Nov 25 15:07:02 owl-pc104-red sudo:      iao : TTY=pts/1 ; PWD=/Owl/menus ; USER=rfts ; COMMAND=/usr/bin/lftp sftp://sftpuser5@192.168.11.153 -e "put /home/rfts/.ssh/id_rsa.pub"

完全使用安全日志中的工作方式:

/usr/bin/lftp sftp://sftpuser5@192.168.11.153 -e "put /home/rfts/.ssh/id_rsa.pub"

但是,pythong脚本不起作用。它要求输入SFTP密码,但随后给出错误:

"Could not copy public key to remote user: File name missed. Try 'help put' for more information."

这里是sudo\u调用方法

    def sudo_call(self, call_list, *args, capture=True,
                  user=None, group=None, **kwargs):
        self.cache_sudo()
        command = ['sudo']

        # Run as the input user and group if specified.
        if user is not None:
            command.extend(['-u', user])
        if group is not None:
            command.extend(['-g', group])

        method = subprocess.check_output if capture else subprocess.check_call
        return method(command + call_list, *args, **kwargs)

Tags: selfnoneoutputifremoteputgroupsudo
1条回答
网友
1楼 · 发布于 2024-04-25 01:21:19

我对您的sudo_call方法做了一些假设,但问题似乎在于您如何在此处拆分命令行:

self.sudo_call(['lftp','sftp://{}@{}'.format(username, address),'-e','"put','/home/rfts/.ssh/id_rsa.pub"'],
  user='rfts',
  stderr=subprocess.STDOUT)

您已将"put /home/rfts/.ssh/id_rsa.pub"拆分为两个参数:

  • '"put'
  • '/home/rfts/.ssh/id_rsa.pub"'

如果要在命令行上执行相同的操作,它将如下所示:

/usr/bin/lftp sftp://sftpuser5@192.168.11.153 -e '"put ' '/home/rfts/.ssh/id_rsa.pub"'

你可能会得到同样的错误。您需要将命令作为单个参数传递给lftp(并且需要避免双引号):

self.sudo_call(['lftp','sftp://{}@{}'.format(username, address),'-e','put /home/rfts/.ssh/id_rsa.pub'],
  user='rfts',
  stderr=subprocess.STDOUT)

相关问题 更多 >