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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2868閲覧

初心者[wx.ComboBox]プルダウンから値を選択した時のSSH接続の遅延について

tei

総合スコア12

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2016/09/10 18:54

###質問
pythonの学習でsshランチャ?を作っています。
ランチャからIP、ユーザ名、パスワードを取得して、
それをもとにteratermマクロで実行してログインする想定です。

IPアドレスの入力フィールドで、プルダウン内の値を選択しSSH接続を行うと、
接続後、一定時間プロンプトが帰ってきません。
フィールド内へ手動でIPアドレスを入力した場合は、
即座にプロンプトが帰ってきます。
こちらの原因を教えていただけますでしょうか。

python

1#問題箇所 2element_array = ["192.168.10.10\n","192.168.11.20\n"] 3text_ip = wx.ComboBox(panel, -1, choices=element_array, style=wx.CB_DROPDOWN)

###ソースコード

python

1#ソース全体 2 3import wx 4import os 5 6 7 8def button_push(event): 9 #初期化 10 clear_txt = open(u'tmp_ip.txt', 'w') 11 clear_txt.write("") 12 clear_txt.close() 13 14 clear_txt = open(u'tmp_username.txt', 'w') 15 clear_txt.write("") 16 clear_txt.close() 17 18 clear_txt = open(u'tmp_password.txt', 'w') 19 clear_txt.write("") 20 clear_txt.close() 21 22 #テキストを抽出 23 input_text_ip = text_ip.GetValue() 24 input_text_u = text_username.GetValue() 25 input_text_p = text_password.GetValue() 26 ip_C = input_text_ip.split(".") 27 check = "True" 28 #IPの確認とIPの抽出 29 if len(ip_C) == 4: 30 for ip in ip_C: 31 ip = int(ip) 32 if ip >= 0 and ip <= 255: 33 check = "True" 34 else : 35 check = "False" 36 wx.MessageBox('IP address error', 'Info') 37 else: 38 wx.MessageBox('IP address error', 'Info') 39 check = "False" 40 41 #tmpファイルにデータを入力 42 if check == "True": 43 ip_f = open(u'tmp_ip.txt', 'w') 44 ip_f.write(input_text_ip) 45 ip_f.close() 46 47 #ユーザ名とパスワードを抽出 48 name_f = open(u'tmp_username.txt', 'w') 49 name_f.write(input_text_u) 50 name_f.close() 51 52 password_f = open(u'tmp_password.txt', 'w') 53 password_f.write(input_text_p) 54 password_f.close() 55 56 #teratermのマクロ起動 57 cmd = "login.ttl" 58 os.system(cmd) 59 60 61app = wx.App() 62frame = wx.Frame(None, -1, u'sshログイン', size=(250, 170)) 63#透明度設定 64#frame.SetTransparent(210) 65#背景にパネルを設置 66panel = wx.Panel(frame,-1) 67 68layout = wx.BoxSizer(wx.VERTICAL) 69 70layout01 = wx.BoxSizer(wx.HORIZONTAL) 71s_text_ip = wx.StaticText(panel, -1, u"IPアドレス") 72layout01.Add(s_text_ip,0, wx.RIGHT, 8) 73 74element_array = ["192.168.10.10\n","192.168.11.20\n"] 75text_ip = wx.ComboBox(panel, -1, choices=element_array, style=wx.CB_DROPDOWN) 76 77#text_ip = wx.TextCtrl(panel,-1) 78 79layout01.Add(text_ip ,wx.RIGHT, 8) 80layout.Add(layout01, 0, wx.EXPAND | wx.LEFT | wx.RIGHT | wx.TOP, 10 ) 81layout.Add((-1,5)) 82 83 84layout02 = wx.BoxSizer(wx.HORIZONTAL) 85s_text_username = wx.StaticText(panel, -1, u"ユーザ名") 86layout02.Add(s_text_username, 0, wx.RIGHT, 13) 87text_username = wx.TextCtrl(panel,-1) 88layout02.Add(text_username,1) 89layout.Add(layout02, 0, wx.EXPAND | wx.LEFT | wx.RIGHT, 10 ) 90 91layout.Add((-1,5)) 92 93layout03 = wx.BoxSizer(wx.HORIZONTAL) 94s_text_password = wx.StaticText(panel, -1, u"パスワード") 95layout03.Add(s_text_password, 0, wx.RIGHT, 8) 96text_password = wx.TextCtrl(panel,-1) 97layout03.Add(text_password, 1) 98layout.Add(layout03, 0, wx.EXPAND | wx.LEFT | wx.RIGHT, 10 ) 99 100layout.Add((-1,5)) 101 102layout04 = wx.BoxSizer(wx.HORIZONTAL) 103button_1 = wx.Button(panel, -1, u"接続",size=(70,30)) 104layout04.Add(button_1, 0, ) 105layout.Add(layout04, 0, wx.ALIGN_RIGHT | wx.RIGHT ,10) 106 107button_1.Bind(wx.EVT_BUTTON, button_push) 108 109 110panel.SetSizer(layout) 111frame.Show() 112app.MainLoop() 113

login.ttl

fileopen USER 'tmp_username.txt' 0 filereadln USER username fileclose USER fileopen PASS 'tmp_password.txt' 0 filereadln PASS password fileclose PASS fileopen IP 'tmp_ip.txt' 0 filereadln IP hostname fileclose IP msg = hostname strconcat msg ':22 /ssh /auth=password /user=' strconcat msg username strconcat msg ' /passwd=' strconcat msg password connect msg

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

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

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

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

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

guest

回答1

0

ベストアンサー

同じIPアドレスをリストから選択した時と手入力した時で、接続したリモート側の
プロンプトが表示されるまでの時間が異なるということですね?

何か違いがあるとすればコンボボックスの要素を指定している以下の配列でしょうか。

python

1element_array = ["192.168.10.10\n","192.168.11.20\n"]

改行コード(\n)が含まれているため、tmp_ip.txt に以下のような違いが出ると思います。

  • リストから選択したとき
192.168.10.10 (ファイル終端)
  • 手入力したとき
192.168.10.10(ファイル終端)

ただ teraterm マクロの filereadln は改行コード取り除くようにドキュメントからは
読み取れますので結果としては関係ないかも知れません。
ダメ元で以下のようにしてみてはどうでしょうか。

python

1element_array = ["192.168.10.10","192.168.11.20"]

投稿2016/09/13 15:10

kozzy

総合スコア30

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

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

tei

2016/09/13 23:21

回答ありがとうございます。改行コードをなくした場合でも、同様の事象が発生しました。 何が原因なんでしょう・・・
kozzy

2016/09/14 03:41

修正後、両者で生成されるファイルには特に差異はないのでしょうか?
tei

2016/09/14 14:46

kozzyさんコメントありがとうございます。 kozzyさんの認識通り、element_array内の改行コードをなくすと、生成されるファイルも改行コードが消えました。
kozzy

2016/09/14 22:47

修正後、手入力したものとリストから選んだものと、 ファイルを16進ダンプして見ても全く同じということであれば、 python側は特に関係なさそうですね。 リスト選択でファイルを生成したあと、login.ttlを直接起動してみても遅いのでしょうか?
tei

2016/09/16 10:45 編集

kozzyさんコメントありがとうございます。 ★改行コードあり [root@localhost ~]# od -Ax -tx1z tmp_ip.txt 000000 31 39 32 2e 31 36 38 2e 31 31 2e 32 30 0d 0a >192.168.11.20..< 00000f ★改行コードなし [root@localhost ~]# od -Ax -tx1z tmp_ip01.txt 000000 31 39 32 2e 31 36 38 2e 31 31 2e 32 30 >192.168.11.20< 00000d バイナリは同じではありませんでした。 リストで生成した直接login.ttlした場合は、素早く正常に起動します
kozzy

2016/09/20 21:32

遅くなりました。改行コード以外に何か変な制御コードが入っている 様子はありませんね。 さて、file.close()を呼ぶとバッファもフラッシュされると思っていたのですが、 どうもそうではない時があるようですので、ファイル書き込み処理を次のように してみてください。 ip_f.write(.......) ip_f.flush() ←これを追加 fp_f.close() name_f、password_f についても同様です。 --- また、login.ttl は次のように変更して下さい。 fileopen IP 'tmp_ip.txt' 0 ↓ fileopen IP 'tmp_ip.txt' 0 1 ※読み取り専用モードになります。teraterm4.85以降で有効なオプションです。 --- 上記の変更ですが、login.ttl を呼んだ時点ではpython側でファイルを閉じて おらず、teratermが読み書きモードで開こうとして待っているのではないか という推測からです。ただソースを見たわけではないので、本当に待って いるのかは不明です。待つようになっていなければ、また別の理由という ことになります。 --- 補足ですが、 ip_f = open(u'tmp_ip.txt', 'w') のように'w'指定でファイルを開いた場合は、ファイルの内容は削除 されますので、スクリプト先頭にある clear_txt = open(u'tmp_ip.txt', 'w') clear_txt.write("") clear_txt.close() は不要です。
tei

2016/09/22 06:49

kozzyさんコメントありがとうございます。 XXX.flush()とlogin.ttlのreadonly flagを立てて実施しましたが、結果は変わりませんでした。 切り分けとして、tmpファイルへip,username,passwordを入力せずに実施したところ、同様の事象が発生しました。login.ttlを直に叩くと動作するので、python側の問題だと思ってます。
kozzy

2016/09/22 13:24

うーん、あとは os.system(cmd) を os.startfile(cmd) にするか、subprocessモジュールを使って書き換えるかですねえ。 ちょっとそれ以外には思いつきません。
tei

2016/09/28 16:09

kozzyさん何度もコメントありがとうございます。 os.startfile(cmd)で動作しました。原因はよくわかりませんが何とか動くようになりました。 助かりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問