1

VPN に接続するために作成した Python スクリプトがあります。その前に、外部 IP をテストし、出力を変数「originip」として記録してから、vpn に接続し、テストを再度実行します。私のoriginip、次にnewipを表示し、origin ipとnewipが同じかどうかをテストする条件を実行し、エラーがあったと言います。後でロジックを追加します。現在、プログラムは正常に動作しますが、Else 行に移動して「正常に接続されました」と出力する代わりに、常に「エラーが発生しました。リセット中です」と出力します。

ここで私のifロジックに何か問題があると思います:

if newip and originip == originip:
    print "there was an error, resetting..."
else:
    print "You are now connected successfully"

したがって、上記をテストしたところ、VPN が正常に接続されると、新しい IP アドレスと古い IP アドレスが異なると報告され、「エラーが発生しました。リセットしています」と表示されます。接続すると、newip と originip の両方が同じものとして表示されます。 、「エラーが発生しました、リセットしています...」も出力されます

上記のステートメントのelse部分を実行することができませんでした。

これがプログラムのPython側全体です

#!/usr/bin/env python
import pexpect
import sys
import os
import time
import subprocess
secdelay = int(raw_input("How many seconds before resetting? "))
p = subprocess.Popen(["./checkmyip.sh"], shell=False, stdout=subprocess.PIPE)
originip = p.stdout.read()
print 'Public IP Address is', originip
child = pexpect.spawn ('./vpn.sh -arg1')
child.expect ('')
child.expect ('(?i)Enter Aut Username:')
child.sendline ('myusername')
child.expect ('(?i)Enter Auth Password:')
child.sendline ('mypassword')
print "Establishing connection..."
time.sleep(10)
p = subprocess.Popen(["./checkmyip.sh"], shell=False, stdout=subprocess.PIPE)
newip = p.stdout.read()
print "The New IP is ",newip
print "the old IP was ", originip
if newip and originip == originip:
    print "there was an error, resetting..."
else:
    print "You are now connected successfully"
print "sleeping for ",secdelay," seconds"
time.sleep(secdelay)
child.sendcontrol('c')
if child.isalive():
    child.sendcontrol('c')
    child.close()
if child.isalive():
    print 'Child did not exit gracefully.'
else:
    print 'Child exited gracefully.'

最後に、「checkmyip.sh」スクリプトに追加したコードを次に示します。それは単純なwgetです:

#!/usr/bin/env bash
wget -q -O - checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//'

したがって、スクリプトは正常に動作します。私を混乱させているのは、このエラー チェック ロジックだけです。if x と y == x が機能しないのはなぜですか。x と y の両方が、if ステートメントのすぐ上の印刷行に異なる値を列挙すると、混乱します。

提案や助けをいただければ幸いです。読んでくれてありがとう!

みんな助けてくれてありがとう!修正されたコードは次のとおりです。

if newip and originip == originip:

に変更されました

if newip == originip:
4

3 に答える 3

2

はい、条件originip == originipは常に True になります。

したがって、newipが空でない場合、式全体newip and originip == originipも True になります。

>>> originip = 'foo'
>>> originip == originip
True
>>> newip = ''
>>> newip and originip == originip
False
>>> newip = 'bar'
>>> newip and originip == originip
True

もしかして:

if newip and newip == originip:

代わりは?

于 2012-12-28T14:31:52.690 に答える
2

代わりにこれを試してください:

if newip == originip:
    print "there was an error, resetting..."
于 2012-12-28T14:32:23.910 に答える
1
>if newip and originip == originip:

の「ブール値」をテストしていて、newip それoriginip自体と等しいかどうかをテストしています。これは常に true です。

あなたはおそらく次のことを意味します:

if newip == originip:
于 2012-12-28T14:31:35.487 に答える