0

これは、SSH 経由の pythons インタラクティブ モードで機能するコマンドに関する質問ですが、スクリプトに含まれている場合は機能しません。それは私を怒らせています。スクリプトに問題がありましたが、Python シェルに行を挿入するだけで、期待どおりの結果が得られることがわかりました。これは私を混乱させます。スクリプトで作業する必要があるため、続行する方法がわかりません。Python シェルの場合、SSH 経由でログインし、Python ssh モジュール経由でログインするのではなく、Python スクリプトを開きます。そこからは、期待どおりに機能します。

import ssh
import gnupg
import pickle

s = ssh.Connection(host = 'ipaddress', username = 'toolserv', password = 'xxxx') 

gpg = gnupg.GPG(gnupghome="/home/toolserv/.gnupg") 

with open("result1.txt", "r") as my_file:
    signed_data1 = pickle.load(my_file)
    my_file.close()

print signed_data1

s.close()

sudo からスクリプトを実行すると、スクリプトから得られるエラーは次のとおりです。

Traceback (most recent call last):
  File "sshx.py", line 11, in <module>
    with open("result1.txt", "r") as my_file:
IOError: [Errno 2] No such file or directory: 'result1.txt

ls -ld の結果は次のとおりです。 drwxr-xr-x 29 toolserv toolserv 4096 2012-08-19 22:38

4

1 に答える 1

3

最初の答え

スクリプトは、ターゲット サーバーではなく、ローカル ホストで実行されます。セッションを開いてSSHから使用しない方法に注意してください。

ユーザーがこのtoolservホストに存在しない可能性があります。したがって、gnupgディレクトリを作成しようとするとエラーが発生します。

あなたのコメントへの反応として:

これを明確にしましょう。単に呼び出すだけでは、後続のすべてのコードがリモート ホストで実行されるわけでs = ssh.Connection(host = 'ipaddress', username = 'toolserv', password = 'xxxx') はありません。

現在、コードで行うことは次のとおりです。

  1. ipaddressSSH 経由でリモート ホストに接続します
  2. ローカル ホスト/home/toolserv/.gnupgにあるキーで gnupg lib を使用します。
  3. ローカル ホストにある (pickled?) ファイルのコンテンツを読み取ります。
  4. その(ピクルされていない)コンテンツを印刷する
  5. SSH 接続を閉じます (使用しないでください)。

SSH 接続を使用することはありません。これはおそらくあなたが望んでいるものではなく、おそらくスクリプトが失敗する理由です。

もちろん、SSH 経由でログインしてからシェルを使用して、リモート ホストでまったく同じスクリプトを実行すると、ローカル ホストが実際にはリモート ホストであるため、機能します。ただし、リモート ホストから実行したときにコードが機能するという事実は、単なる偶然に過ぎません

最後にもう一度言いますが、あなたのスクリプトはおそらくあなたが思っていることを実行しないでしょう。それを調査しない限り、スクリプトは決して機能しません。

于 2012-08-20T11:31:48.247 に答える