Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python守护进程中的Paramiko导致IOError_Python_Linux_Ssh_Paramiko_Python Daemon - Fatal编程技术网

Python守护进程中的Paramiko导致IOError

Python守护进程中的Paramiko导致IOError,python,linux,ssh,paramiko,python-daemon,Python,Linux,Ssh,Paramiko,Python Daemon,我试图在python守护进程中使用paramiko执行ssh命令。 我正在为守护进程使用以下实现: 当程序启动时,pycrypto会在paramiko尝试连接时引发带有错误文件描述符的IOError。 如果我删除守护程序代码(只需取消最后一行的注释并对上面两行进行注释),就会按照预期建立ssh连接 短测试程序的代码如下所示: #!/usr/bin/env python2 from daemon import runner import paramiko class App(): de

我试图在python守护进程中使用
paramiko
执行
ssh
命令。 我正在为守护进程使用以下实现:

当程序启动时,
pycrypto
会在paramiko尝试连接时引发带有
错误文件描述符的
IOError
。 如果我删除守护程序代码(只需取消最后一行的注释并对上面两行进行注释),就会按照预期建立
ssh
连接

短测试程序的代码如下所示:

#!/usr/bin/env python2
from daemon import runner
import paramiko

class App():

    def __init__(self):
        self.stdin_path = '/dev/null'
        self.stdout_path = '/dev/tty'
        self.stderr_path = '/dev/tty'
        self.pidfile_path =  '/tmp/testdaemon.pid'
        self.pidfile_timeout = 5

    def run(self):
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh.load_system_host_keys()
        ssh.connect("hostname", username="username")
        ssh.close()

app = App()
daemon_runner = runner.DaemonRunner(app)
daemon_runner.do_action()
#app.run()
Traceback (most recent call last):
  File "./daemon-test.py", line 31, in <module>
    daemon_runner.do_action()
  File "/usr/lib/python2.7/site-packages/daemon/runner.py", line 189, in do_action
    func(self)
  File "/usr/lib/python2.7/site-packages/daemon/runner.py", line 134, in _start
    self.app.run()
  File "./daemon-test.py", line 22, in run
    ssh.connect("hostname", username="username")
  File "/usr/lib/python2.7/site-packages/paramiko/client.py", line 311, in connect
    t.start_client()
  File "/usr/lib/python2.7/site-packages/paramiko/transport.py", line 460, in start_client
    Random.atfork()
  File "/usr/lib/python2.7/site-packages/Crypto/Random/__init__.py", line 37, in atfork
_UserFriendlyRNG.reinit()
  File "/usr/lib/python2.7/site-packages/Crypto/Random/_UserFriendlyRNG.py", line 224, in reinit
_get_singleton().reinit()
  File "/usr/lib/python2.7/site-packages/Crypto/Random/_UserFriendlyRNG.py", line 171, in reinit
    return _UserFriendlyRNG.reinit(self)
  File "/usr/lib/python2.7/site-packages/Crypto/Random/_UserFriendlyRNG.py", line 99, in reinit
    self._ec.reinit()
  File "/usr/lib/python2.7/site-packages/Crypto/Random/_UserFriendlyRNG.py", line 62, in reinit
    block = self._osrng.read(32*32)
  File "/usr/lib/python2.7/site-packages/Crypto/Random/OSRNG/rng_base.py", line 76, in read
data = self._read(N)
  File "/usr/lib/python2.7/site-packages/Crypto/Random/OSRNG/posix.py", line 65, in _read
    d = self.__file.read(N - len(data))
IOError: [Errno 9] Bad file descriptor
跟踪结果如下所示:

#!/usr/bin/env python2
from daemon import runner
import paramiko

class App():

    def __init__(self):
        self.stdin_path = '/dev/null'
        self.stdout_path = '/dev/tty'
        self.stderr_path = '/dev/tty'
        self.pidfile_path =  '/tmp/testdaemon.pid'
        self.pidfile_timeout = 5

    def run(self):
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh.load_system_host_keys()
        ssh.connect("hostname", username="username")
        ssh.close()

app = App()
daemon_runner = runner.DaemonRunner(app)
daemon_runner.do_action()
#app.run()
Traceback (most recent call last):
  File "./daemon-test.py", line 31, in <module>
    daemon_runner.do_action()
  File "/usr/lib/python2.7/site-packages/daemon/runner.py", line 189, in do_action
    func(self)
  File "/usr/lib/python2.7/site-packages/daemon/runner.py", line 134, in _start
    self.app.run()
  File "./daemon-test.py", line 22, in run
    ssh.connect("hostname", username="username")
  File "/usr/lib/python2.7/site-packages/paramiko/client.py", line 311, in connect
    t.start_client()
  File "/usr/lib/python2.7/site-packages/paramiko/transport.py", line 460, in start_client
    Random.atfork()
  File "/usr/lib/python2.7/site-packages/Crypto/Random/__init__.py", line 37, in atfork
_UserFriendlyRNG.reinit()
  File "/usr/lib/python2.7/site-packages/Crypto/Random/_UserFriendlyRNG.py", line 224, in reinit
_get_singleton().reinit()
  File "/usr/lib/python2.7/site-packages/Crypto/Random/_UserFriendlyRNG.py", line 171, in reinit
    return _UserFriendlyRNG.reinit(self)
  File "/usr/lib/python2.7/site-packages/Crypto/Random/_UserFriendlyRNG.py", line 99, in reinit
    self._ec.reinit()
  File "/usr/lib/python2.7/site-packages/Crypto/Random/_UserFriendlyRNG.py", line 62, in reinit
    block = self._osrng.read(32*32)
  File "/usr/lib/python2.7/site-packages/Crypto/Random/OSRNG/rng_base.py", line 76, in read
data = self._read(N)
  File "/usr/lib/python2.7/site-packages/Crypto/Random/OSRNG/posix.py", line 65, in _read
    d = self.__file.read(N - len(data))
IOError: [Errno 9] Bad file descriptor
回溯(最近一次呼叫最后一次):
文件“/daemon test.py”,第31行,在
daemon_runner.do_action()
文件“/usr/lib/python2.7/site packages/daemon/runner.py”,第189行,在do_action中
func(self)
文件“/usr/lib/python2.7/site packages/daemon/runner.py”,第134行,在_start中
self.app.run()
文件“/daemon test.py”,第22行,正在运行
ssh.connect(“主机名”,用户名=“用户名”)
文件“/usr/lib/python2.7/site packages/paramiko/client.py”,第311行,在connect中
t、 启动客户机()
文件“/usr/lib/python2.7/site packages/paramiko/transport.py”,第460行,在start_client中
Random.atfork()
atfork中的文件“/usr/lib/python2.7/site packages/Crypto/Random/_init__.py”,第37行
_userfriendlyring.reinit()
reinit中的文件“/usr/lib/python2.7/site packages/Crypto/Random/_UserFriendlyRNG.py”,第224行
_get_singleton().reinit()
文件“/usr/lib/python2.7/site packages/Crypto/Random/_UserFriendlyRNG.py”,第171行,在reinit中
return\u userFriendlyng.reinit(self)
文件“/usr/lib/python2.7/site packages/Crypto/Random/_UserFriendlyRNG.py”,第99行,在reinit中
赛尔夫
文件“/usr/lib/python2.7/site packages/Crypto/Random/_userFriendlyng.py”,第62行,在reinit中
block=self.\u osrng.read(32*32)
文件“/usr/lib/python2.7/site packages/Crypto/Random/OSRNG/rng_base.py”,第76行,已读
数据=自读数(N)
文件“/usr/lib/python2.7/site packages/Crypto/Random/OSRNG/posix.py”,第65行,已读
d=自文件.read(N-len(数据))
IOError:[Errno 9]错误的文件描述符
我猜这与守护进程生成时的流重定向有关。我尝试将它们全部设置为
/dev/tty
,甚至设置为普通文件,但都没有效果


当我用
strace
运行程序时,我可以看到有东西试图关闭一个文件两次,这就是我得到错误的时候。但我无法找出描述符实际指向的文件(
strace
显示的内存位置似乎没有设置在任何位置)。

这是我自己实际遇到的一个已知问题(这就是导致我提出这个问题的原因)。基本上,它与UNIX守护进程的定义以及paramiko实现其随机数生成器(RNG)的方式有关

如果您提到,成为正确的守护程序的第一步是“关闭所有打开的文件描述符”。不幸的是,这会将文件描述符关闭为
/dev/uradom
,该文件描述符用于加密模块的RNG,而paramiko反过来使用它

目前有一些解决办法,但作者表示,他目前没有时间研究这个bug(尽管第一个链接中的最后一篇文章是作者写的,并且在撰写本文时已经8天了)

总之,如果在进程成为守护进程后
导入paramiko
,则该进程应能正常工作,因为在守护进程关闭所有文件描述符后,文件描述符将被打开

用户@xraj在后台监控时(上面的第一个链接),也有一个老练但聪明的解决方法,用于查找和保存
/dev/uradom
的文件描述符:


这种情况最近发生在守护进程和多线程应用程序中,使mass close()处于分离线程的循环中。我在pipe.PosixPipe类中发现了这个问题。set()和close()方法之间没有同步。PosixPipe的方法可以同时读取/写入和关闭套接字的描述符。 问题已创建: 请求撤销: