从message.py中得到错误 - 执行fabric.Connection.run()时,paramiko“‘bool’类型的对象没有len()”

问题描述 投票:0回答:1

我使用fabric 2.6.0、paramiko 2.9.2并调用1.4.0

这是错误还是不兼容的东西我收到了这样的错误。

文件“/usr/local/lib/python3.7/dist-packages/paramiko/message.py”, 第 274 行,在 add_string 中 self.add_int(len(s)) TypeError:“bool”类型的对象没有 len()

当我设置

dry=True
我就变成这样了。

>>> conn.run('touch hello.txt', dry=True)
touch hello.txt
<Result cmd='touch hello.txt' exited=0>

这是我得到的完整错误。

Python 3.7.5 (default, Dec  9 2021, 17:04:37)
[GCC 8.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from fabric import Connection
>>> conn = Connection('192.168.1.16')
>>> conn.open()
>>> conn.is_connected
True
>>> conn.run('touch hello.txt')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<decorator-gen-3>", line 2, in run
  File "/usr/local/lib/python3.7/dist-packages/fabric/connection.py", line 30, in opens
    return method(self, *args, **kwargs)
  File "/usr/local/lib/python3.7/dist-packages/fabric/connection.py", line 723, in run
    return self._run(self._remote_runner(), command, **kwargs)
  File "/usr/local/lib/python3.7/dist-packages/invoke/context.py", line 102, in _run
    return runner.run(command, **kwargs)
  File "/usr/local/lib/python3.7/dist-packages/invoke/runners.py", line 380, in run
    return self._run_body(command, **kwargs)
  File "/usr/local/lib/python3.7/dist-packages/invoke/runners.py", line 431, in _run_body
    self.start(command, self.opts["shell"], self.env)
  File "/usr/local/lib/python3.7/dist-packages/fabric/runners.py", line 57, in start
    self.channel.update_environment(env)
  File "/usr/local/lib/python3.7/dist-packages/paramiko/channel.py", line 72, in _check
    return func(self, *args, **kwds)
  File "/usr/local/lib/python3.7/dist-packages/paramiko/channel.py", line 332, in update_environment
    self.set_environment_variable(name, value)
  File "/usr/local/lib/python3.7/dist-packages/paramiko/channel.py", line 72, in _check
    return func(self, *args, **kwds)
  File "/usr/local/lib/python3.7/dist-packages/paramiko/channel.py", line 361, in set_environment_variable
    m.add_string(value)
  File "/usr/local/lib/python3.7/dist-packages/paramiko/message.py", line 274, in add_string
    self.add_int(len(s))
TypeError: object of type 'bool' has no len()

这是我的 ssh 配置

Host *
    Port 22
    User ubuntu
    IdentityFile /home/ubuntu/.ssh/id_rsa

当我从 shell 运行

ssh 192.168.1.16
时可以成功连接远程计算机。

python paramiko fabric pyinvoke python-fabric-2
1个回答
0
投票

经过一段时间的调试,发现这个错误是由于配置错误造成的。

实际发生的事情是我在

fabric.yaml
上放置了一些环境变量,以便在结构运行时自动加载,并且当我想打开与远程服务器的连接时会发生问题。

当我使用fabric运行命令时,后面发生的事情是,fabric将使用paramiko打开ssh连接,然后

try to send the local environment variable that I set in fabric.yaml to the remote machine (this thing that cause the error)

如果不将本地和远程计算机的

SendEnv
AcceptEnv
的设置放入 sshd_config 中,则无法使用 ssh 将环境变量从本地计算机发送到远程,或者替代方案是启用
PermitUserEnvironment yes
这仅适用于远程计算机并且不要忘记在远程主目录中创建
environment
文件(当您执行此操作时为 home ssh)。

希望我的错误可以帮助其他也有类似问题的人。

© www.soinside.com 2019 - 2024. All rights reserved.