Как увидеть, что /bin/sh указывает на
Я читал о различиях между /bin/sh и/bin/ bash и наткнулся на этот интересный вопрос/ответ: здесь
Я сделал комментарий к ответу, задав тот же вопрос в своем названии, на который он ответил с обновленным ответом:
Как узнать, что /bin/sh указывает на вашу систему?
Усложнение состоит в том, что /bin/sh может быть символической ссылкой или сложной ссылка. Если это символическая ссылка, переносимый способ ее устранения:
> % file -h /bin/sh
> /bin/sh: symbolic link to bash
Если это жесткая ссылка, попробуйте
> % find -L /bin -samefile /bin/sh
> /bin/sh
> /bin/bash
Я пробовал это и имел проблемы, поэтому я подумал, что задаю отдельный вопрос.
Мои результаты из связанного ответа:
>file -h /bin/sh
>/bin/sh: executable (RISC System/6000) or object module
>find -L /bin -samefile /bin/sh
>find: bad option -samefile
Что мне не хватает?
Я запускаю AIX:
>oslevel -s
7100-03-03-1415
Ответы
Ответ 1
Если вам необходимо программно проверить, являются ли они одинаковыми, вы можете использовать stat
для запроса inode
в /bin/sh
и сравнить с inode
от /bin/bash
.
if [ $(stat -L -c %i /bin/sh) -eq $(stat -L -c %i /bin/bash) ]; then
.....
fi
Если вам просто нужно видеть своими глазами, если они одинаковы, запустите команды stat
и посмотрите, вернут ли они тот же номер inode
.
stat -L -c %i /bin/sh
stat -L -c %i /bin/bash
Ответ 2
Так как вы все равно просматриваете bin
, вы можете полностью обойти find
и просто проверить, являются ли sh
и bash
жесткими ссылками на один и тот же файл:
test /bin/sh -ef /bin/bash
ИЛИ
[ /bin/sh -ef /bin/bash ]
Это не так надежно, как запуск find
для всех возможностей, но это хороший старт. Хотя AIX find
не поддерживает -samefile
, он поддерживает -exec
, который можно комбинировать с приведенной выше командой для имитации та же функциональность:
find -L /bin -exec test /bin/sh -ef '{}' ';'
Ответ 3
Проверить наличие GNU Bash
Я собираюсь ответить на ваш вопрос по-другому, потому что на самом деле проще узнать, является ли sh GNU Bash (или что-то еще, что отвечает на флаг --version
), чем для преследования inodes. Там также крайний случай, когда оболочка переименована, а не связана, и в этом случае ссылки на отображение не помогут вам найти ответ.
Например, для запроса /bin/sh на macOS:
$ /bin/sh --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin16)
Copyright (C) 2007 Free Software Foundation, Inc.
В качестве альтернативы вы можете использовать grep (или подобное) для строки bash
, чтобы зафиксировать статус выхода. Например:
# Close stderr in case sh doesn't have a version flag.
if sh --version 2>&- | grep -qF bash; then
echo "sh is bash"
else
echo "sh isn't bash"
fi
Конечно,/bin/sh может быть какой-то другой оболочкой, кроме Bash или оригинальной оболочки bourne, но это выходит за рамки вашего исходного вопроса. Тем не менее, многие оболочки, такие как ksh и tcsh, также поддерживают флаг версии, поэтому разумное использование оператора case
может помочь вам расширить тест, чтобы точно определить, какая оболочка имеет бинарный файл/bin/sh.
Ответ 4
Как ответ, о котором вы прокомментировали, -samefile
не является стандартной функцией find
. Также нет -inum
, который ищет на основе явно заданного номера inode. Но если ваш find
поддерживает это, используйте его.
POSIX ls
поддерживает -i
, который печатает номера inode. Если find
не имеет -inum
, все, что вам нужно сделать, это пройти через все правдоподобные файлы. /bin/sh
может быть жесткой ссылкой с...
Хотя до этого вы могли проверить, есть ли у файла какие-либо другие жесткие ссылки, ls -l
требуется, чтобы показать количество ссылок:
$ ls -l /bin/bash
-rwxr-xr-x 1 root root 1029624 Nov 5 23:22 /bin/bash
^ here
Конечно, нет необходимости связывать /bin/sh
с чем-либо. Это может быть просто еще одна программа. (Или даже идентичная копия какого-либо другого файла, хотя я не думаю, что это очень вероятно.)