3

Python を使用して Debian システムでホスト名を設定する方法をスクリプト化しています。私は成功します:

  • arg1 から新しいホスト名を取得するか、それを変数の値として定義した場合
  • 現在のホスト名を取得する
  • /etc/hostname変数から新しいホスト名を開いてファイルに書き込み、その後それを閉じます。
  • /etc/hosts読み取りまたは書き込み用に開く

そこで行き詰まります。実行する文字列として読み取ろうとしましたstr.replace(oldname, newname)が、ファイルの内容を に変換しないと問題が発生しますstr。それをすると、ファイルを書き込めなくなります。

または、試してみましre.sub()たが、同様に結果を に書き込むのに問題があります/etc/hosts

フィードバックをお待ちしております。

私は例を調査し、 CentOS の解決策を見つけました。そこから学びましたが、問題の解決策がわかりません。

Bash は、こ​​の仕事に最適なツールです。連結しないと3行。ただし、Python ソリューションが必要です。

上記のコードは、ホスト名に書き込みます: 私はそれを処理しました。同じ戦略がホストで機能することはわかりません。

ここに作業コードがあります。提案に感謝します。それらを考慮する必要があります。結論も省略しました。しかし、これは狭義に定義された仕事をします:

#!/usr/bin/python -ex
import os, sys, syslog

#Customize
hosts_file = '/etc/hosts'
hostname_file = '/etc/hostname'

#Check for root
if not os.geteuid()==0:
    sys.exit("\nOnly root can run this script\n")

if len(sys.argv) != 2:
    print "Usage: "+sys.argv[0]+" new_hostname"
    sys.exit(1)

new_hostname = sys.argv[1]

print 'New Hostname: ' +new_hostname

#get old hostname
f_hostname = open('/etc/hostname', 'r')
old_hostname = f_hostname.readline()
old_hostname = old_hostname.replace('/n','')
f_hostname.close()

print 'Old Hostname: ' +old_hostname

#open hosts configuration
f_hosts_file = open(hosts_file, 'r')
set_host = f_hosts_file.read()
f_hosts_file.close()
pointer_hostname = set_host.find(old_hostname)

#replace hostname in hosts_file
set_host = set_host.replace(old_hostname, new_hostname)
set_host_file = open(hosts_file,'w')
set_host_file.seek(pointer_hostname)
set_host_file.write(set_host)
set_host_file.close()

#insert code to handle /etc/hostname

#change this system hostname
os.system('/bin/hostname '+new_hostname)

#write syslog
syslog.syslog('CP : Change Server Hostname')

次に、古いホスト名があった場所に新しいホスト名を書き込む/置き換える単一の関数を作成したいと考えています。

4

2 に答える 2

1

あなたが提供したリンクは、読み取り用にホストファイルを開き、その内容を文字列に保存し、文字列で置換を呼び出し、ファイルを閉じ、書き込み用にファイルを開き、文字列を書き込みます-これは問題の解決策ではありませんか?

f = open("/etc/hosts", "r")     #open file for reading
contents = f.read()             #read contents
f.close()                       #close file
contents.replace(old, new)      #replace
f = open("/etc/hosts", "w")     #open file for writing
f.write(contents)               #write the altered contents
f.close()                       #close file

r+次のモードを使用して、ファイルを閉じて再度開くことなく、これを行うこともできます。

f = open("/etc/hosts", "r+")    #open file with mode r+ for reading and writing
contents = f.read()             #read the file
contents.replace(old, new)      #replace
f.seek(0)                       #reset the file pointer to the start of the file
f.truncate()                    #delete everything after the file pointer
f.write(contents)               #write the contents back
f.close()                       #close the file

replace特別な予防措置を講じない場合、使用は安全ではないことに注意してください。たとえば、ホスト名は、ホスト ファイルに含まれる他のホスト名またはエイリアスの部分文字列である可能性があるため、置換の前にスペースで囲むことは最低限必要です。また、入力したものがホスト名として有効であることも確認する必要があります。hostnameこれらすべてに対処する最も簡単な方法は、OS の組み込みコマンドを .xml 経由で呼び出すことでしょうsubprocess.Popen

于 2012-11-13T18:44:40.967 に答える
1

ドメインでホスト名を変更するPython関数には、ファイルシステムの任意の場所にhosts_tailという名前のヘルプファイルが必要です。

ヘルプ ファイル hosts_tail

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

Python 関数:

def set_hostname(hostname,domain):
"""
usage: set_hostname('debian','labor.local')
"""
try:
    os.system('echo 127.0.0.1    localhost > /etc/hosts')
    os.system('echo 127.0.1.1    '+ hostname + '.' + domain + ' ' + hostname +  ' >> /etc/hosts')
    os.system('cat ' + mypath + 'config/hosts_tail >> /etc/hosts')
    os.system('echo ' + hostname + ' > /etc/hostname')
    os.system('echo ' + hostname + '.' + domain + ' > /etc/mailname')
    os.system('cat /etc/resolv.conf | grep nameserver | uniq > /tmp/resolv.tmp')
    os.system("echo domain " + domain + ' > /etc/resolv.conf')
    os.system("echo search " + domain + ' >> /etc/resolv.conf')
    os.system('cat /tmp/resolv.tmp | uniq >> /etc/resolv.conf')
    os.system('rm -rf /tmp/resolv.tmp')
    os.system('/etc/init.d/hostname.sh start')
except Exception, e:
    return False
return True

私のデビアンOS:

cat /etc/debian_version
6.0.6
于 2012-11-13T19:00:44.340 に答える