Python: выполнить команду оболочки, используя переменную

В моей лаборатории мне нужно изменить интерфейс на сервере на случайный адрес IPv6. У меня есть два скрипта. Первый скрипт создает случайный IPv6-адрес и отлично работает. Я пытаюсь взять вывод этого скрипта и использовать его как переменную во втором скрипте. Затем запустите команду ifconfig, чтобы установить этот IPv6-адрес на этом интерфейсе. Это общий итог того, что я пытаюсь сделать. Ниже приведен скрипт, который генерирует случайный адрес IPv6, ipv6_gen.py.

from random2 import seed, getrandbits
from ipaddress import IPv6Network, IPv6Address

subnet = u'1234:5678:ab:cde::/64'

seed()
network = IPv6Network(subnet)
address = IPv6Address(network.network_address + getrandbits(network.max_prefixlen - network.prefixlen))

print(address)

Этот должен взять вывод первого и выполнить команду ifconfig.

import ipv6_gen
import os, commands
import subprocess
import shlex

ipv6=ipv6_gen
shell_cmd = ("sudo ifconfig en0 inet6 add %s" %ipv6)

subprocess_cmd = shlex.split(shell_cmd)
subprocess.call(subprocess_cmd)

Я получаю следующие ошибки:

ubuntu:~$ python change_ipv6.py 
1234:5678:ab:cde:8087:1bb6:b264:acdd
<module: Host name lookup failure
getaddrinfo: ipv6_gen: -3
ipv6_gen: Host name lookup failure
ifconfig: `--help' gives usage information.

когда я запускаю ifconfig, адрес IPv6 не устанавливается. Не уверен, что я делаю неправильно, пытался исследовать это некоторое время и ничего не получил. Любая помощь будет оценена по достоинству.


person imclallen    schedule 10.02.2018    source источник
comment
Помните, что ifconfig устарел в системах Linux, и вместо него следует использовать ip.   -  person Michael Hampton    schedule 11.02.2018


Ответы (1)


Второй сценарий выглядит немного странно.

Вы назначаете модуль ipv6_gen переменной ipv6, а затем используете ее для команды оболочки.

Попробуйте эту версию:

import ipv6_gen
import os, commands
import subprocess
import shlex

ipv6 = ipv6_gen.address
shell_cmd = ("sudo ifconfig en0 inet6 add %s" % ipv6)

subprocess_cmd = shlex.split(shell_cmd)
subprocess.call(subprocess_cmd)
person Ilija    schedule 10.02.2018
comment
Ваше изменение сработало!! Спасибо. Думаю, теперь я пытаюсь понять, почему (.address) заставил это работать? - person imclallen; 11.02.2018
comment
Это действительно то, что вы должны знать при использовании Python. Подойдет любое руководство по modules, packages и импорту в Python. Это должно вам помочь. - person Ilija; 11.02.2018
comment
Если бы я мог, я бы, вероятно, порекомендовал еще немного поработать и определить функцию, возвращающую адрес в ipv6_gen, а не делать все в ее __main__ и обращаться к ее переменной. - person Ondrej K.; 11.02.2018
comment
Я должен был начать говорить, что я нуб со сценариями и питоном. Я могу вырезать фрагменты из других скриптов, чтобы они работали на меня. Но я пытаюсь понять больше. Спасибо за ссылку. - person imclallen; 11.02.2018