diff
от GNU diffutils имеет опцию для рекурсивного, сравните:
diff -qrs /dir/A /dir/B
сравнивает каталоги: -q
бесшумно (т.е. никакие различия печатаются, это только сообщает, что файлы отличаются), -r
рекурсивно (завершают деревья со всеми подкаталогами), -s
создание отчетов об идентичных файлах.
Вы запутались между ПУТЬ
, который находится в реальной среде выполнения sudo
, и ПУТЬ
, который sudo
устанавливает в среда программы, которую он запускает. Из руководства sudo
:
Когда sudo запускает команду, она вызывает fork (2), настраивает среду выполнения, как описано выше, и вызывает системный вызов execve в дочернем процессе.
С помощью execve
вы указываете среду, которую вы хотите, чтобы дочерний процесс имел, то есть она может отличаться от родительского процесса.
Часто secure_path
устанавливается в / etc / sudoers
:
secure_path
Путь, используемый для каждой команды, запускаемой из sudo. Если вы не доверяете людям, запускающим sudo, иметь разумную переменную среды PATH, возможно, вы захотите ее использовать. Другое использование - это если вы хотите, чтобы «корневой путь» был отделен от «пути пользователя». На пользователей в группе, указанной параметром exc_group, не влияет secure_path. Этот параметр не установлен по умолчанию.
Если это установлено, sudo
будет искать команду в этом ПУТЬ
и устанавливать ее в среде выполняемой команды. Он также будет отображаться в выводе sudo sudo -V
со строкой вроде:
Value to override user's $PATH with: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Однако в вашем случае это не установлено, поэтому sudo
будет использовать PATH
в своей собственной среде выполнения (которая в данном случае наследуется от родительской оболочки).Хотя он был настроен на игнорирование текущего каталога, если он был помещен в ПУТЬ
:
Ignore '.' in $PATH
Поскольку env_reset
равно в вашем / etc / sudoers
(и ПУТЬ
не входит в строку env_keep
), будет определена ПУТЬ
, которую sudo
устанавливает в вызываемой команде. PAM
или / etc / environment
и, таким образом, отличается от ПУТЬ
sudo
использует для поиска своего местоположения:
По умолчанию, опция env_reset включена. Это заставляет команды выполняться в новой минимальной среде. В AIX (и системах Linux без PAM) среда инициализируется содержимым файла / etc / environment. Новая среда содержит переменные TERM, PATH, HOME, MAIL, SHELL, LOGNAME, USER, USERNAME и SUDO_ * в дополнение к переменным из вызывающего процесса, разрешенным параметрами env_check и env_keep.
Чтобы запустить питон
в ПУТЬ
, установленном sudo
, вы должны сделать что-то вроде этого:
sudo env python -V
Это не Сам sudo
ищет команду, а env
будет иметь среду, установленную sudo
, а env
будет искать команду там.
Ответ Грэма[11700] является довольно исчерпывающим, однако есть две вещи, которые должны быть сказаны явно, даже если они не являются ответом на ваш вопрос:
1 . Если вас беспокоит безопасность - какой она должна быть, когда вы используете (независимо от того, какие пользователи) - используйте [11701]secure_path[11702]. В противном случае вредоносный скрипт, помеченный как исполняемый практически в любом месте вашей системы, может вызвать хаос на (а не только) локальной машине. И скрипт не должен быть размещен непосредственно на вашей системе - сетевая файловая система, смонтированная без [11703]noexec[11704], тоже подойдёт.