質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1925閲覧

pythonのライブラリ「paramiko」にてpythonコマンドだけ実行できず困っております

aluter

総合スコア1

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2022/12/17 10:13

編集2022/12/17 14:10

(2022/12/17 21:20追記)
(2022/12/17 21:35修正)
(2022/12/17 23:10追記)

サーバを二つ用意して
Aサーバの{paramikoファイル}.pyを実行してBサーバの{実行ファイル}.pyを実行したいのですが、どうしても実行できません。

■構成イメージ
<Aサーバ>
A_appディレクトリ
→{paramikoファイル}.py
→{paramikoファイル}.sh
<Bサーバ>
B_appディレクトリ
→{実行ファイル}.py
→{実行ファイル}.sh

■前提
・A,Bともにubutuサーバ
・下記各コーディング内容

shell

1# ■{paramikoファイル}.sh 2source /home/xxx/.bashrc 3echo $環境変数名 4echo "アプリサーバ" 5/usr/bin/python3 /フルパス/{実行ファイル}.py 6echo "処理完了です"

python

1# ■<{paramikoファイル}.py> 2#別サーバのメイン処理実行 3def {メイン関数名}(data): 4 print(data) # テスト用メッセージ【X】 5 with paramiko.SSHClient() as client: 6 7 #logging.basicConfig() 8 #logging.getLogger("paramiko").setLevel(logging.DEBUG) 9 10 # 接続先情報(バッチサーバ) 11 HOSTNAME = {'IPアドレス'} 12 USERNAME = {'Iユーザー名'} 13 KEY_FILENAME = {'秘密鍵格納先'} 14 15 # 実行コマンド設定(★いくつかのコマンドをテスト用に実行) 16 print("BB") # テスト用メッセージ 【Y】 17 #LINUX_COMMAND = 'cd {{実行ファイル}.pyへのフルパス} ; python3 {実行ファイル}.py' # ケース1 18 #LINUX_COMMAND = '/usr/bin/python3 {{実行ファイル}.pyへのフルパス}/{実行ファイル}.py' # ケース2 19 LINUX_COMMAND = 'bash {{実行ファイル}.shへのフルパス}/{実行ファイル}.sh' # ケース3 20 #LINUX_COMMAND = 'ls -l {{実行ファイル}.pyへのフルパス}/{実行ファイル}.py' # ケース99 21 22 # SSH接続 23 client = paramiko.SSHClient() 24 client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 25 26 # 公開鍵認証方式 27 client.connect(HOSTNAME, username=USERNAME, key_filename=KEY_FILENAME) 28 29 # コマンド実行 30 stdin, stdout, stderr = client.exec_command(LINUX_COMMAND) 31 32 for line in stdout: 33 print(line, end='') 34 35if __name__ == "__main__": 36 data = "バッチ実行" 37 {メイン関数名}(data)

shell

1#■<{実行ファイル}.sh> 2source /home/xxx/.bashrc 3echo $環境変数名 4echo "Webサーバ" 5/usr/bin/python3 /フルパス/{実行ファイル}.py --pyファイル実行用 6echo "処理完了です" --テスト用メッセージ【Z】 7done

python

1# ■<{実行ファイル}.py> 2##メインクラス 3if __name__ == '__main__': 4 5 touch_file = pathlib.Path( "./20221217test.txt" ) # 空ファイル作成 【★Bサーバで実行すると出力されるがAサーバからだと作成されない】 6 touch_file.touch() 7 8 print("print出力") # テスト用メッセージ【α】 9 logger = LogOutTest.LogOutTest() # ログファイル出力用関数 【★Bサーバで実行すると出力されるがAサーバからだと出力されない】 10 logger.info('処理中') 11 a = 1 12 b = 2 13 c = a + b 14 logger.info('変数a:' + str(a) + '|変数b:' + str(b) + '【処理結果:' + str(c) + '】') 15 logger.info('処理済')

■試行内容 【print,echo結果】
①AサーバからsshコマンドでBサーバに接続してpython3コマンド({実行ファイル}.py)実施【α】
②AサーバからsshコマンドでBサーバに接続してshコマンド({実行ファイル}.sh)実施【Z,α】
③Aサーバpython3コマンド({paramikoファイル}.py)実施 # ケース1,2【X,Y】
④Aサーバpython3コマンド({paramikoファイル}.py)実施 # ケース3【X,Y,Z】

環境設定か、コーディングが悪いのか、それともparamikoの仕様か
どうか調査しても特定できないため、ご助力いただけないでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TakaiY

2022/12/17 12:32 編集

もういちど、お聞きします。 質問などにある「失敗」とか「実行できません」とか「※実行結果無し」とあるのはどのようなことになったことを表わしていますか? エラーメッセージが出る? 何も出力されていないようにみえる? 単にprint文で何かを表示するだけの.pyだとどのようになりますか?
aluter

2022/12/17 12:30

全体的に質問の内容を修正いたします。
TakaiY

2022/12/17 12:59 編集

状況からすると、やっぱりエラーになっているんじゃないでしょうかね。 stderr に何か入っていると思うので、そちらも表示してみるとどうなりますか? for line in stderr: print(line, end='')
aluter

2022/12/17 13:06 編集

ご回答ありがとうございます。 下記にて原因がわかりました。 >for line in stderr: >print(line, end='') →自作アプリのため、環境変数(.bashrc)をいろいろ設定して  {実行ファイル}.py内に環境変数を取得するようにしていたのですが、  A = os.environ['環境変数名']  それがエラーとなっておりました。 エラー内容:KeyError: '環境変数名' A,Bサーバともに同じ環境変数を設定してましたが、何かしらの設定が必要かもしれないです。 試しに、{実行ファイル}.pyから環境変数等の設定を除いたところ、うまくいきました。 ※Aサーバpython3コマンド({paramikoファイル}.py)実施 # ケース3【X,Y,Z,α】 stderrについての理解がなくご指摘ありがとうございます。
TakaiY

2022/12/17 13:08

いえいえ。 もうちょっと早く気づけばよかったです。 ただ、やはり、「失敗した」などの抽象的な言葉では、発している側と受けている側で認識が違ってしまうため、質問にはもっと具体的に書く必要がありますね。 解決済みにしやすいように、回答に追記しておきます。
aluter

2022/12/17 13:11

早急な回答ありがとうございました。 とても助かりました!
jbpb0

2022/12/17 22:06 編集

> →自作アプリのため、環境変数(.bashrc)をいろいろ設定して  {実行ファイル}.py内に環境変数を取得するようにしていたのですが、  A = os.environ['環境変数名']   それがエラーとなっておりました。 環境変数を「.bashrc」ではなく「.bash_profile」または「.profile」で設定してもダメでしょうか? 参考 https://techracho.bpsinc.jp/hachi8833/2021_07_08/66396
guest

回答1

0

ベストアンサー

python3 をフルパスで指定したらいいのではないかと思います。
/usr/binにインストールされているなら、

shell

1LINUX_COMMAND = '/usr/bin/python3 ~/B_app/{実行ファイル}.py'

もしかすると、 B_appもフルパスにしたほうがいいかもしれません。


追記

状況からすると、やっぱりエラーになっているんじゃないでしょうかね。
stderr に何か入っていると思うので、そちらも表示してみるとどうなりますか?

python

1 for line in stderr: 2 print(line, end='')

さらに追記

→自作アプリのため、環境変数(.bashrc)をいろいろ設定して
{実行ファイル}.py内に環境変数を取得するようにしていたのですが、
A = os.environ['環境変数名']
それがエラーとなっておりました。

.bashrcは、普通にログインすると読み込まれますが、ツールによるログインなどでは読み込まれない場合があります。
どのようなときに読まれるかは意外と面倒なので、環境変数を使って情報をやりとりしたいのであれば、pythonファイルをshellから呼ぶようにして、しかもそのshellの中で明示的に ~/.bashrc をsourceするようにしたほうがいいですね。

shell

1source /home/xxx/.bashrc 2 3/usr/bin/python3 /home/xxx/yyy.py

投稿2022/12/17 10:40

編集2022/12/17 13:15
TakaiY

総合スコア12743

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aluter

2022/12/17 11:40

ご回答ありがとうございます。 試してみて下記ファイルにていづれのパターンもうまくいかない状態です。 <{paramikoファイル}.py> LINUX_COMMAND = '/usr/bin/python3 /フルパス/{実行ファイル}.py' 【失敗】※実行結果無し LINUX_COMMAND = 'ls -l /フルパス/{実行ファイル}.py' 【成功】 ※フルパス情報が誤っていないかを確認 試しにshellでも実行してみてうまくいきませんでした。 <{実行ファイル}.sh> ARRAY=(1 2) for num in ${ARRAY[@]}; do /usr/bin/python3 /フルパス/{実行ファイル}.py --pyファイル実行用 echo $num"回目のループです" --本ファイル実行有無確認用 done
TakaiY

2022/12/17 11:53

「※実行結果無し」とはどういうことでしょう? コマンドがみつからないとかいうことであれば、ちゃんと動いているのでは? コマンドを見ると、 for line in stdout: print(line, end='') これ、何も表示されなくてあたりまえだと思いますけど。 固定の文字を出力するprint文でためしてみたらどうなりますか?
aluter

2022/12/17 12:10

早急なご回答ありがとうございます。 情報足らずで申し訳ございません。 print文は<{実行ファイル}.py>に仕込んでいて 下記イメージでコーディングしております。 *********************** {}=別名に変更した意 ①<{paramikoファイル}.py> #別サーバのメイン処理実行 def {メイン関数名}(data): print(data) # どこまで処理がうまくいっているかテスト用メッセージ 【毎回出力される】 with paramiko.SSHClient() as client: #logging.basicConfig() #logging.getLogger("paramiko").setLevel(logging.DEBUG) # 接続先情報(バッチサーバ) HOSTNAME = {'IPアドレス'} USERNAME = {'Iユーザー名'} KEY_FILENAME = {'秘密鍵格納先'} # 実行コマンド設定(★いくつかのコマンドをテスト用に実行) print("BB") # どこまで処理がうまくいっているかテスト用メッセージ 【毎回出力される】 #LINUX_COMMAND = 'cd {{実行ファイル}.pyへのフルパス} ; python3 {実行ファイル}.py' # テストファイルを実行 #LINUX_COMMAND = '/usr/bin/python3 {{実行ファイル}.pyへのフルパス}/{実行ファイル}.py' # テストファイルを実行 LINUX_COMMAND = 'bash {{実行ファイル}.shへのフルパス}/{実行ファイル}.sh' # テストファイルを実行 #LINUX_COMMAND = 'ls -l {{実行ファイル}.pyへのフルパス}/{実行ファイル}.py' # SSH接続 client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 公開鍵認証方式 client.connect(HOSTNAME, username=USERNAME, key_filename=KEY_FILENAME) # コマンド実行 stdin, stdout, stderr = client.exec_command(LINUX_COMMAND) for line in stdout: print(line, end='') if __name__ == "__main__": data = "バッチ実行" {メイン関数名}(data) ②<{実行ファイル}.sh> ARRAY=(1 2) for num in ${ARRAY[@]}; do /usr/bin/python3 /フルパス/{実行ファイル}.py --pyファイル実行用 echo $num"回目のループです" --本ファイル実行有無確認用 done ③<{実行ファイル}.py> ##メインクラス if __name__ == '__main__': touch_file = pathlib.Path( "./20221217test.txt" ) touch_file.touch() print("print出力") # この応答は返ってくる予定 logger = LogOutTest.LogOutTest() logger.info('処理中') a = 1 b = 2 c = a + b logger.info('変数a:' + str(a) + '|変数b:' + str(b) + '【処理結果:' + str(c) + '】') logger.info('処理済') *********************** ※念のため、一括してパッケージのアップデートしても変化なし
TakaiY

2022/12/17 12:12

ここに書かれてもインデントが表示されないので、質問を編集して載せていただけますか。 上記のコメントは長いので削除いただければと。
TakaiY

2022/12/17 12:17

見ていただいている方に伝わるように、基本的な質問を質問のコメントに書きました。
aluter

2022/12/17 12:27

ご連絡ありがとうございます。 質問内容について、不得手で申し訳ございません。 質問を編集しました。 >見ていただいている方に伝わるように、基本的な質問を質問のコメントに書きました。 →こちらも確認いたします。
aluter

2022/12/17 13:12

ご回答ありがとうございます。 下記にて原因がわかりました。 >for line in stderr: >print(line, end='') →自作アプリのため、環境変数(.bashrc)をいろいろ設定して  {実行ファイル}.py内に環境変数を取得するようにしていたのですが、  A = os.environ['環境変数名']  それがエラーとなっておりました。 エラー内容:KeyError: '環境変数名' A,Bサーバともに同じ環境変数を設定してましたが、何かしらの設定が必要かもしれないです。 試しに、{実行ファイル}.pyから環境変数等の設定を除いたところ、うまくいきました。 ※Aサーバpython3コマンド({paramikoファイル}.py)実施 # ケース3【X,Y,Z,α】 stderrについての理解がなくご指摘ありがとうございます。
aluter

2022/12/17 14:11

>.bashrcは、普通にログインすると読み込まれますが、 >ツールによるログインなどでは読み込まれない場合があります。 >どのようなときに読まれるかは意外と面倒なので、環境変数を使って情報をやりとりしたいのであれば、 >pythonファイルをshellから呼ぶようにして、 >しかもそのshellの中で明示的に ~/.bashrc をsourceするようにしたほうがいいですね。 →ご指摘ありがとうございます。  現在、試しておりますが、ちょっと上手くいかないです。。。  >source /home/xxx/.bashrc    いろいろ試しながら実行中です。
TakaiY

2022/12/17 14:26

> 上手くいかない まあ、あれwwwですが、具体的に書いただければアドバイスできますよ。
aluter

2022/12/17 14:37

ありがとうございます! 質問に記載しました。 {paramikoファイル}.shでは環境変数が設定されていることはechoで確認できております。 ただし、{実行ファイル}.shでは環境変数が設定されていることがechoで確認できずにかつ {実行ファイル}.pyの実行で下記エラー(stderr)が発生している次第です。 Traceback (most recent call last): File "{実行ファイルフルパス}/{実行ファイル}.py", line 6, in <module> A = os.environ['環境変数名'] File "/usr/lib/python3.8/os.py", line 675, in __getitem__ raise KeyError(key) from None KeyError: '環境変数名'
aluter

2022/12/17 15:05 編集

一応力技ですが、環境変数に設定した情報を{実行ファイル}.shに直接記載することで、環境変数名でのエラー(KeyError: '環境変数名')がなくなりました!
TakaiY

2022/12/18 07:56

source /home/xxx/.bashrc echo $環境変数名 ・ この /home/xxx/.bashrc のxxxの部分が本当に存在するパスになっている ・ その.bashrcの中に必要なあっその環境変数が含まれている なのに、 echo $環境変数 で 表示されないのだとしたら、かなりおかしな状況ですね。 そんなことはありえないと思うので、あらためてちゃんと確認してみていただけますか。
aluter

2022/12/30 07:35 編集

更新がしばらくぶりとなりました。 ↓備忘↓ 調査して"source /home/xxx/.bashrc"が実行されていないことが分かりました。 引き続き調査中。
aluter

2022/12/30 08:20

解決しました。 "/home/xxx/.bashrc"の改行コードがLFではなかったためとなります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問