Измените ссылку/bin/sh временно

У меня есть часть программного обеспечения, которое требует /bin/sh чтобы быть Bash, но для Ubuntu, значение по умолчанию является Тире, и я хочу сохранить это значением по умолчанию; я не хочу изменять его на Bash постоянно.

Существует ли способ изменить его только для рабочего терминального сеанса? Таким образом, программа, работающая в этом терминале, будет видеть /bin/sh связанный с ударом, но остальной частью системы будет все еще видеть Тире? Или я могу обмануть программное обеспечение для наблюдения /bin/sh как Bash, даже если нет?

Я не записал это программное обеспечение и взламывание его для использования /bin/bash вместо /bin/sh не действительно опция.

8
задан 12 September 2018 в 00:46

4 ответа

Два ответа уже предлагают chrooting и связывают, монтируется, и существует одна треть, тесно связанная опция: смонтируйте пространства имен. Используя unshare программа, Вы можете создать новое пространство имен монтирования и монтируетесь в этом пространстве имен, не будет влиять на другие пространства имен.

Например, в одном терминале, я делаю:

muru|[0] ~ sudo unshare -m /bin/bash
root@muru-1604:~# sudo mount --bind /bin/bash /bin/sh
root@muru-1604:~# /bin/sh --version
GNU bash, version 4.4.18(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
root@muru-1604:~# sudo -iu muru
muru|[0] ~ /bin/sh --version  # propagates
GNU bash, version 4.4.18(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

И в другом:

$ /bin/sh --version
/bin/sh: 0: Illegal option --

Таким образом, Вы могли запустить эту негибкую программу в ее собственном пространстве имен монтирования.

10
ответ дан 23 November 2019 в 05:21

Если это - сценарий, просто назовите сценарий как

bash scriptname.sh

Никакая потребность изменить ссылки вообще.

Для скомпилированного исполняемого файла можно пойти chroot путем:

mkdir rootfs
cp -a /usr rootfs/
cp -a /lib rootfs/
cp -a /lib64 rootfs/
cp /bin/bash  rootfs/bin/sh
cp yourprogram  rootfs/
sudo chroot rootfs  sh

И затем запущенный Ваша программа или sudo chroot rootfs /yourprogram


Однако на практике нет никакой причины, почему Вы не можете использовать /bin/bash как символьная ссылка на /bin/sh. На самом деле до версии 6.10 Ubuntu использовала /bin/bash как /bin/sh, и затем они переключились из-за /bin/sh будучи намного более быстрой, более минимизированной реализацией POSIX /bin/sh (то есть, это придерживается стандарта POSIX для того, как подобные Unix утилиты операционной системы и ОС должны вести себя и реализовать некоторые свои внутренности), и из-за причин мобильности. Я настоятельно рекомендую читать ответ Gilles также для исторических очерков на как /bin/dash появился. Что касается совместимости, сценарии, записанные для dash использование функций POSIX будет работать с bash будучи превосходной оболочкой по умолчанию. Обычно, это наоборот, который вызывает проблемы - bash имеет функции, которые не требуются /bin/sh, как <<< синтаксис или массивы.

Кроме того, рассматриваемая команда, вероятно, записана с RHEL или CentOS в памяти, который действительно использует /bin/bash как символьная ссылка на /bin/sh, предлагает две вещи: они, вероятно, были нацелены на определенную ОС и не придерживались принципов POSIX. В этом случае это также была бы хорошая идея проверить то, чего других вещей требует команда, с тех пор, если это действительно записано с другой ОС в памяти, Вы могли бы столкнуться с большим количеством проблем, чем просто пересоединение /bin/sh.

14
ответ дан 23 November 2019 в 05:21

Одна возможность была бы связыванием, монтируются единственного файла. Чтобы сделать это, Вы монтируете файл /bin/bash просто /bin/dash так bash вид покрытий или скрывается dash. Вот шаги (включая реверс):

root@myhost:~# cd /bin

# situation before (bash and dash are different):
root@myhost:/bin# ls -l *sh*
-rwxr-xr-x 1 root root 1113504 Apr  4 20:30 bash
-rwxr-xr-x 1 root root  121432 Jan 25  2018 dash
lrwxrwxrwx 1 root root       4 Jul 13 11:38 sh -> dash
...

# mount /bin/bash over /bin/dash:
root@myhost:/bin# mount --bind /bin/bash /bin/dash

# situation now (bash and dash are the same):
root@myhost:/bin# ls -l *sh*
-rwxr-xr-x 1 root root 1113504 Apr  4 20:30 bash
-rwxr-xr-x 1 root root 1113504 Apr  4 20:30 dash
lrwxrwxrwx 1 root root       4 Jul 13 11:38 sh -> dash
...

# Now everything that runs `/bin/sh` in fact uses `/bin/bash`.

# check what the symlink "sh" says:
root@myhost:/bin# sh --version
GNU bash, version 4.4.19(1)-release (x86_64-pc-linux-gnu)
...

# undo the mount:
root@myhost:/bin# umount /bin/dash 

# situation now (bash and dash are different again):
root@myhost:/bin# ls -l *sh*
-rwxr-xr-x 1 root root 1113504 Apr  4 20:30 bash
-rwxr-xr-x 1 root root  121432 Jan 25  2018 dash
lrwxrwxrwx 1 root root       4 Jul 13 11:38 sh -> dash
...

# check what the symlink "sh" now says:
root@myhost:/bin# sh --version
sh: 0: Illegal option --

Я не пытался mount --bind /bin/bash /bin/sh непосредственно скрыть символьную ссылку, все же. Вышеупомянутое mount прием просто делает удар и тире идентичными так, чтобы sh относится к bash хотя это указывает на dash. Кроме того, это - решение в масштабе всей системы, не только для текущего окна терминала.


Я должен признаться, это могло бы быть излишеством, и просто изменение символьной ссылки временно намного легче. Я просто хотел показать другой возможный путь.

5
ответ дан 23 November 2019 в 05:21

Необходимо смочь изменить его для просто текущей сессии при помощи псевдонима. Прежде, чем выполнить Вашу команду в терминале:

alias sh=bash

Это будет временным и только активным в терминале, от которого это выполнялось.

ОДНАКО: Это НЕ будет РАБОТАТЬ, если Ваш сценарий будет использовать полные пути.

Хорошая идея как таковая, но если программное обеспечение непосредственно называет/bin/sh с явным путем, это не будет работать. Так или иначе то программное обеспечение, кажется, очень правильно не разработано, делая такие предположения. Я, вероятно, выполнил бы его из сценария, который готовит и сбрасывает надлежащую среду, если я должен был использовать его вообще. – ванадий

К сожалению, "взламывание" сценария могло бы быть Вашей единственной опцией. На convo с @vanadium Вы могли создать сценарий обертки как это:

#!/bin/bash
sudo ln -sf /bin/bash /bin/sh
/run/my/script
sudo ln -sf /bin/dash /bin/sh

Однако во время продолжительности Вашего сценария, Вы лучше надеетесь, что ничто в Вашей системе явно не требует тире.

1
ответ дан 23 November 2019 в 05:21

Другие вопросы по тегам:

Похожие вопросы: