user7402472
user7402472

Reputation: 11

How do I change the hostname using Python on a Raspberry Pi

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?

Upvotes: 1

Views: 9005

Answers (3)

Ben
Ben

Reputation: 83

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

Upvotes: 1

WindowsEscapist
WindowsEscapist

Reputation: 125

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

Upvotes: 2

Stephen Rauch
Stephen Rauch

Reputation: 49774

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')

Upvotes: 1

Related Questions