2

pexpect.spawn(cmd)以下のように、cmd が文字列である python 関数を呼び出したいと思います。

ssh -t kity@192.199.61.205 'sudo nohup bash -c "./tcp_sender > /dev/null 2>&1 &"'

IP アドレスは常に変化しているため、次のようになります。

ssh -t kity@%s 'sudo nohup bash -c "./tcp_sender > /dev/null 2>&1 &"' %host_ip

いくつか'あり"、対処法に困っているので基本的にはpython文字列のエスケープ処理と可変部分文字列がある場合の対処法についてです

ありがとう

4

2 に答える 2

7

三重引用符を使用できます。

"""ssh -t kity@{0} 'sudo nohup bash -c "./tcp_sender > /dev/null 2>&1 &"'""".format(ip_address)
于 2013-04-18T23:33:30.433 に答える
0

キャメロン・スパーはすでに一般的な答えを出しています。

しかし、あなたの特定のケースでは、おそらくこれは必要ありません。

pexpect.spawnコマンドと引数の文字列、またはコマンド文字列と個別の引数文字列のリストのいずれかを受け入れます。subprocessまた、他のライブラリ (標準ライブラリモジュール内のすべてのものなど) のほとんどの同様のメソッドについても同じことが言えます。

したがって、次のように、各引数を文字列にするだけで済みます。

pexpect.spawn('ssh', ['-t', 'kity@192.199.61.205', 'sudo nohup bash -c "./tcp_sender > /dev/null 2>&1 &"'])

実際、ドキュメントはこれを具体的に示唆しています。これは、まさに次の理由によるものです。

spawn の 2 番目の形式 (引数のリストを渡す) は、コマンドを生成して独自の引数リストを渡したい場合に便利です。これにより、構文がより明確になります。

もちろん、あなたの場合、実際には引数のリストを使用してコマンドを生成しています...そのうちの1つは、それ自体が生成するコマンドであり、引数のリストですsudo( )、明らかにこれらのステップの最初の段階でしか役に立ちません。幸いなことに、この場合、必要なのはそれだけです。nohupbashtcp_senderpexpect

さらに必要な場合、引数リストから POSIX スタイルの引用符付き文字列を生成できるライブラリがいくつかあります (基本的には の逆ですshlex)。結局、自分で書き直してしまいました… 実際にはそれほど複雑ではありません (基本的には、すべてをエスケープしてからすべての引数を引用するだけです)。しかし、うまくいけば、これを行う必要はありません。

于 2013-04-18T23:59:18.747 に答える