1

I tried using (going from memory, this may not be 100% accurate):

import socket
socket.sethostname("NewHost")

I got a permissions error.

How would I approach this entirely from within the Python program?

3 Answers 3

2

I wanted to change the hostname permanently, which required making changes in a few places, so I made a shell script:

#!/bin/bash
# /usr/sbin/change_hostname.sh - program to permanently change hostname.  Permissions
# are set so that www-user can `sudo` this specific program.

# args:
# $1 - new hostname, should be a legal hostname

sed -i "s/$HOSTNAME/$1/g" /etc/hosts
echo $1 > /etc/hostname
/etc/init.d/hostname.sh
hostname $1  # this is to update the current hostname without restarting

In Python, I ran the script with subprocess.run:

subprocess.run(
    ['sudo', '/usr/sbin/change_hostname.sh', newhostname])

This was happening from a webserver which was running as www-data, so I allowed it to sudo this specific script without a password. You can skip this step and run the script without sudo if you're running as root or similar:

# /etc.d/sudoers.d/099-www-data-nopasswd-hostname
www-data ALL = (root) NOPASSWD: /usr/sbin/change_hostname.sh
Sign up to request clarification or add additional context in comments.

Comments

1

If you only need to do change the hostname until the next reboot, many linux system can change it with:

import subprocess
subprocess.call(['hostname', 'newhost'])

or with less typing but some potential pitfalls:

import os
os.system('hostname %s' % 'newhost')

Comments

1

Here is a different approach

    import os
    def setHostname(newhostname):
        with open('/etc/hosts', 'r') as file:
        # read a list of lines into data
        data = file.readlines()

        # the host name is on the 6th line following the IP address
        # so this replaces that line with the new hostname
        data[5] = '127.0.1.1       ' + newhostname

        # save the file temporarily because /etc/hosts is protected
        with open('temp.txt', 'w') as file:
            file.writelines( data )

        # use sudo command to overwrite the protected file
        os.system('sudo mv temp.txt /etc/hosts')

        # repeat process with other file
        with open('/etc/hostname', 'r') as file:
            data = file.readlines()

        data[0] = newhostname

        with open('temp.txt', 'w') as file:
            file.writelines( data )

        os.system('sudo mv temp.txt /etc/hostname')

    #Then call the def
    setHostname('whatever')

At the next reboot the hostname will be set to the new name

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.