2022年7月7日木曜日

python のコードをsshごしにプッシュする

Python には-cというオプションがあり、これを使うとコードを引数として与える事ができる。例えば、test.py というファイルがあった場合、
python -c "`cat test.py`"
などとやれば、test.pyを実行できる。ではこれをSSH越しにできるかというとちょっと難しい。
ssh REMOTE python -c "`cat.test.py`"
とやれば良さそうなものだが、コード部分がリモートのシェルで一旦解釈されてしまうので、エスケープする必要がある。 色々試行錯誤してできたのがこんなコード。要するに、全体をダブルクォートで囲み、中のダブルクォートはバックスラッシュで エスケープする、というだけ。全体をシングルクォートで囲むと中のシングルクォートをエスケープする方法が無いので詰む。 要するにシェルから渡す引数にプログラムを全部乗っけるので、限界がありそうだが、 このページを参考に調べてみると、 ubuntu 22.04では2M、macosで1Mなので、そう簡単には破綻しなさそう。
def load_and_preprocess(filename):
    with open(filename) as f:
        p = [l for l in f.readlines()]
        prog = "".join(p)
    prog = prog.replace('"', '\\"')
    prog = '"' + prog + '"'
    return prog


proc = subprocess.Popen(
    ['ssh', 'localhost',
        'python',
    '-c',
        load_and_preprocess('src/rjupyter_server.py')
    ],
    stdout=subprocess.PIPE
)

0 件のコメント: