Python如何调用yaml文件中的参数来执行ssh命令

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python如何调用yaml文件中的参数来执行ssh命令相关的知识,希望对你有一定的参考价值。

有几个ssh命令需要调用参数,参数写在yaml中

参考技术A 安装一个pyyaml库。它会解析这个文件,变成一个类似json加载后的结构。字典,列表什么的。然后自己找参数。

ssh命令同样要使用一个库。简单的办法是通过一个封装popen这样功能 的pexpect
, 我以前用过paramiko。 另外似乎还有一个SSH库,最近流行的。不记得名子了。

也有人用ssh4py 这个库。

yaml这个格式比较人性化,易读,易管理。比json还要简单。比xml少了编码和解析成DOM的麻烦。追问

其实就是想问如何找到yaml里面的这个参数,谢了

追答

那你有yaml的文件吗?这个文件可以直接用文本编辑器打开的。直接就找到了。如果打开这个文件,你还是不清楚是哪个参数,就问一下当初设计yaml配置文件的程序员

通常yaml的配置文件内容都很清楚,一看就知道了。
ssh,设置好好,通常只需要提供host, port的数字就可以连接了。连接后再输入用户名与密码。
具体步骤取决于你使得哪 个ssh的客户端。

其它的ssh登陆成功后的unix命令,这个常用的也不多吧。就10几条。略略看看unix命令帮助就知道。

本回答被提问者采纳

pyyaml 中的默认构造函数参数

【中文标题】pyyaml 中的默认构造函数参数【英文标题】:Default constructor parameters in pyyaml 【发布时间】:2011-11-05 15:29:36 【问题描述】:

我无法在 PyYAML 文档中找到如何执行此操作。我想表示我在 YAML 中定义的 python 类,并且如果在 YAML 中未指定参数,则为构造函数中的参数提供默认值。例如:

>>> class Test(yaml.YAMLObject):
...     yaml_tag = u"!Test"
...     def __init__(self, foo, bar=3):
...             self.foo = foo
...             self.bar = bar
...     def __repr__(self):
...             return "%s(foo=%r, bar=%r)" % (self.__class__.__name__, self.foo, self.bar)
... 
>>> yaml.load("""
... --- !Test
... foo: 5
... """)
Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
  File "<stdin>", line 7, in __repr__
AttributeError: 'Test' object has no attribute 'bar'

我预计它会使用bar=3 创建一个Test 对象,但我猜它在创建对象时会绕过我的构造函数。如果我在 YAML 中包含 bar 的映射,一切都会按预期工作:

>>> yaml.load("""
... --- !Test
... foo: 5
... bar: 42
... """)
Test(foo=5, bar=42)

有谁知道我如何让它使用默认值?

【问题讨论】:

【参考方案1】:

我遇到了同样的问题:yaml_tag 由于某种原因无法正常工作。所以我使用了替代方法:

import yaml

def constructor(loader, node) :
    fields = loader.construct_mapping(node)
    return Test(**fields)

yaml.add_constructor('!Test', constructor)

class Test(object) :
    def __init__(self, foo, bar=3) :
        self.foo = foo
        self.bar = bar
    def __repr__(self):
        return "%s(foo=%r, bar=%r)" % (self.__class__.__name__, self.foo, self.bar)

print yaml.load("""
- !Test  foo: 1 
- !Test  foo: 10, bar: 20 """)

输出:

[Test(foo=1, bar=3), Test(foo=10, bar=20)]

【讨论】:

【参考方案2】:

基于 alexanderlukanin13 的回答。这是我的剪辑。

import yaml

YAMLObjectTypeRegistry = 

def register_type(target):
    if target.__name__ in YAMLObjectTypeRegistry:
        print "0 already in registry.".format(target.__name__)
    elif 'yaml_tag' not in target.__dict__.keys():
        print target.__dict__
        raise TypeError("0 must have yaml_tag attribute".format(
            target.__name__))
    elif target.__dict__['yaml_tag'] is None:
        pass
    else:
        YAMLObjectTypeRegistry[target.__name__] = target
        yaml.add_constructor(
                target.__dict__['yaml_tag'],
                lambda loader, node: target(**loader.construct_mapping(node)))
        print "0 added to registry.".format(target.__name__)

class RegisteredYAMLObjectType(type):
    def __new__(meta, name, bases, class_dict):
        cls = type.__new__(meta, name, bases, class_dict)
        register_type(cls)
        return cls

class RegisteredYAMLObject(object):
    __metaclass__=RegisteredYAMLObjectType
    yaml_tag = None

然后你可以像这样使用它:

class MyType(registry.RegisteredYAMLObject):
    yaml_tag = u'!mytype'
    def __init__(self, name, attr1='default1', attr2='default2'):
        super(MyType, self).__init__()
        self.name = name
        self.attr1 = attr1
        self.attr2 = attr2

【讨论】:

以上是关于Python如何调用yaml文件中的参数来执行ssh命令的主要内容,如果未能解决你的问题,请参考以下文章

如何从 python 中的嵌套 YAML 文件中读取数据?

Python配置文件管理之ini和yaml文件读取

python 参数化之读取yaml文件中的内容

如何从使用 python 解析的 yaml 文件中调用和迭代值?

文件参数化-utp框架之根据yaml文件自动生成python文件

python 新手请教,用java调用.py如何用java传入python参数,谢谢