Есть ли способ предоставить определенное имя хоста приложению, которое отличается от имени хоста машины в Linux? По сути, у меня есть часть программного обеспечения, которая ожидает, что локальная машина будет иметь определенное имя хоста, которое отличается от имени хоста моей машины. Вместо того, чтобы менять имя хоста машины глобально, я хотел бы иметь механизм, с помощью которого я мог бы либо запустить программу в среде с указанным именем хоста, либо запустить программу напрямую с указанным именем хоста.
решение1
Это возможно с правами root. Используйтеunshare --uts
чтобы создать новое пространство имен UTS 1 , задайте в нем желаемое имя хоста, затем su
вернитесь в свою учетную запись и запустите приложение. Например:
ongun@foo$ sudo -s
~ create a new namespace ~
root@foo# unshare --uts /bin/sh
~ this terminal now has its own namespace – change the hostname ~
root@foo# hostname quux
~ switch back ~
root@quux# sudo -s -u ongun
ongun@quux$ /usr/bin/game
Пространства имен по умолчанию ограничены процессом их создателя, поэтому новое имя хоста будет видно только программам, которые вы запускаете.внутри«неразделенное» окно.
Примечание:Не забудьте добавить новое имя хоста, например /etc/hosts
127.0.0.1, так как многие программы ожидают/зависят от того, будет ли оно разрешимым.
1 Не спрашивайте, что означает "UTS". Насколько я знаю, это остаток древнего Unix.
решение2
Если ваше приложение не считывает выходные данные из файла напрямую hostname
, /etc/hostname
вы всегда можете создать псевдоним для своей машины, как показано ниже.
#
# /etc/hosts: static lookup table for host names
#
#<ip-address> <hostname.domain.org> <hostname>
127.0.0.1 localhost.localdomain localhost MYHOSTNAME OTHER_ALIAS
::1 localhost.localdomain localhost MYHOSTNAMEv6 OTHER_ALIASv6
или вы можете попробовать создать chroot с другим именем хоста, напримерздесь
решение3
Я предполагаю, что у вас нет исходного кода программы, о которой идет речь. Чтение имени хоста машины выполняется через вызов sys,gethostname(), обойти которую без доступа к исходному коду программы будет сложно.
Затем вам следует использовать виртуальное решение для запуска программы. Контейнеры, докеры, виртуальные машины имеют достаточную степень изоляции, чтобы вы могли переименовать их в требуемое значение, не подвергая риску вашу хост-машину.Контейнерочень легкое решение, которое потребляет очень мало ресурсов вашего хоста.