Предположим, я нахожусь в той же папке, что и исполняемый файл, мне нужно будет ввести это, чтобы выполнить его:
./file
Я бы предпочел не печатать /, потому что /мне сложно печатать.
Есть ли более простой способ выполнить файл? В идеале это простой синтаксис, такой как:
.file
или что-то еще, но проще, чем вставлять /туда персонажа.
Возможно, есть какой-то способ поместить что-то в /bin
каталог или создать псевдоним для интерпретатора, чтобы я мог использовать:
p file
filenames
executable
IMSoP
источник
источник
/
используется в Unix, в основном как разделитель каталогов. Возможно, вам лучше найти более простой способ напечатать его./
набрать текст несложно для подавляющего большинства людей, и если у ОП есть травма, которая мешает этому, им следует рассмотреть альтернативные раскладки клавиатуры, поскольку они не могут/
полностью избежать их, находясь в терминале./
shift-7, который сравнительно сложно напечатать даже без травм.Ответы:
Это может быть «рискованно», но вы могли бы просто иметь. в вашем ПУТИ.
Как уже говорилось в других, это может быть опасно, поэтому всегда следите. находится в конце пути, а не в начале.
источник
cd
в каталог, доступный для записи всем пользователям, и попытаетесь использовать команду, которой нет в вашем пути, вы можете выполнить (возможно, злонамеренный) исполняемый файл с тем же именем, которое кто-то написал по этому пути. Это намного хуже, если вы положили.
в начале вашего пути. В этом случае вредоносный исполняемый файл с именемls
будет выполнен, если вы попытаетесь вызватьls
этот каталог.p
будет лучше..
началаPATH
все, что нужно сделать злоумышленнику, это добавить поддельнуюls
команду в свой каталог и убедить администратора «посмотреть на что-то странное», и у него есть root-доступ.test
, как в заголовке вопроса (посколькуtest
он встроен в оболочку и, вероятно, уже существует где-то в вашем файле$PATH
)..
будет автоматически завершать./
(печатать.
и нажимать Tab) по крайней мере в современных оболочках Bash, поэтому вам не нужно использовать сложное или небезопасное (например,PATH
модификационное) решение.Если он не завершается автоматически, вам может потребоваться установить пакет «bash-complete».
источник
.
имеет несколько кандидатов на завершение:.
(текущий каталог),..
(родительский каталог),.
команду (для которой bash предоставляет нестандартный псевдонимsource
) и все имеющиеся файлы точек. Возможноbash-completion
пакет игнорирует это; Я нахожу это ужасно раздражающим (например, это делает невозможным заполнение табуляцией имен dir вmake
командной строке и, как правило, ужасно с make-файлами, полными неявных правил), поэтому я всегда очищаю его.make
целей.Можно написать такую функцию:
в вашем
~/.bashrc
. Тогда вы сможете бежатьp app arguments
вместо./app arguments
. Это решение работает для исполняемых файлов любого типа, включая скрипты и двоичные файлы."$@"
расширяется до надлежащим образом цитируемого списка аргументов, передаваемых функции (сохраняя все специальные символы из расширения glob или variable), и, как указал @Scott,bash
достаточно умен,./
чтобы присоединиться к первому из них, сохраняя остальные.источник
strace -f p app
для просмотра системных вызовов или$(which time) p app
для определения продолжительности работы.p
как исполняемый скрипт будет работать лучше в этих двух конкретных примерах, которые я придумал. Ни одно из этих решений не может работатьldd p app
, хотяldd
и отличается тем, что требует полного пути, возможно, по таким причинам.p app args
с./app args
таким способом , который является невидимым для любого трубопровода потребует ввода оболочки через какое - то препроцессор и будет вызывать все виды удовольствия , когда замена происходит в незапланированном месте :)$@
? В противном случае он просто передаст один большой аргумент программе.$@
это массив. При раскрытии внутри"
каждый параметр раскрывается в отдельное слово.$*
ведет себя так, как вы думаете.p() { ./"$@"; }
все, что вам нужно.Вы можете добавить
.
к своему$PATH
, добавив, например,PATH=$PATH:.
к вашему/etc/profile
, таким образом, вы можете выполнитьfile
просто написавfile
, если он не находится в какой-то другой папке в вашем пути (например/usr/bin/
). Обратите внимание, что это, как правило, не очень хорошая идея.Почему это плохо: скажем, вы находитесь в ситуации, когда вы не полностью доверяете содержимому каталога - вы скачали его откуда-то изворотливо и хотите исследовать его перед запуском, или вы системный администратор, помогающий некоторым пользователя, просматривая его домашний каталог и т. д. Вы хотите перечислить каталог, поэтому вы пытаетесь набрать ls, но, к сожалению, вы сделали опечатку и в итоге вместо этого набрали sl. Автор этого вредоносного каталога предвидел это и поместил в него скрипт оболочки с именем «sl», который запускает «rm -rf --no-preserve-root /» (или что-то более вредоносное, например, установка руткита).
(Спасибо @Muzer за объяснение)
источник
Вы можете позвонить переводчику, например,
В этом случае скрипт будет работать, даже если у него нет ни строки Шебанга (например
#!/bin/bash
), ни исполняемого бита. Вы должны будете знать правильный переводчик, чтобы запустить его также. Вы можете сначала прочитать строку shebang файла, чтобы убедиться, что вы вызываете правильный интерпретатор, например, если в строке shebang написаноты бы позвонил
источник
/lib/ld.so
Насколько я знаю, нет способа достичь этого, если вы не включите файл в путь env, поэтому вы можете запустить его, просто набрав:
file
.file
не будет работать, так как это другое имя файла. Это файл называется.file
и нет./file
.Я чувствую, что слеш может быть трудно напечатать для вас, потому что не английский макет, может быть? В этом случае это также происходит со мной, поэтому я часто меняю раскладку клавиатуры на английский, нажимая Alt + Shift в Windows (я использую Linux из ssh)
источник
Люди предложили добавить
.
кPATH
, что это опасно , потому что это создает риск того, что вы случайно запустить вредоносную программу посаженной в мировом перезаписываемом каталоге. Но, если у вас есть исполняемые программы в нескольких каталогах , которыми вы владеете и доступны для записи только вам, то это безопасно (достаточно безопасно?) Поставить эти директор (е) вPATH
, добавляя строкув ваш
~/.bashrc
файл. Конечно, это означает, что вы можете запустить программу из одного из этих каталогов из любой точки файловой системы. Например, вы могли быcd /etc
и напечататьfoo
, и он будет работать~/dev/myprog1/foo
. Это имеет небольшой недостаток: вы не можете иметь программы с одинаковыми именами в более чем одном каталоге. В частности, если у вас есть программы, вызываемыеfoo
в обоих~/dev/myprog1
и~/dev/myprog2
, вы не сможете запустить вторую, кроме как путем указания пути. Точно так же, если у вас есть~/dev/myprog1/cat
- но почему вы хотите?Другой подход, если у вас есть всего несколько программ, с которыми вы делаете это, это определить для них псевдонимы:
Или вы можете назвать псевдонимы,
.gizmo
и.gonzo
если вы найдете это более интуитивным.На самом деле, это в некоторой степени та же угроза безопасности, что и
.
вашаPATH
. Если злоумышленник может читать ваши.bashrc
и видеть свои псевдонимы, то он может поставить под названием вредоносных программgizmo
иgonzo
в случайных каталогах , в надежде , что вы будете запускать его. Лучше сделать так, чтобы они использовали абсолютные пути:Кстати, вам следует избегать именования исполняемого файла
test
, потому что это встроенная команда оболочки, и вы можете запускать программу под этим именем только путем указания пути или другого трюка.источник
make gizmo
илиmake gonzo
.Makefile
в каждом каталоге, чтобы действия дляmake gizmo
завершения выполнялисьgizmo
? (1) Это выглядит как неуклюжий способ сделать то же самое, что иp
функция, предложенная в вопросе, первоначально реализованная aitap и уточненная Скоттом. (2) Можете ли вы передать аргументы таким образом? ISTM, чтоmake gizmo arg1 arg2
эквивалентноmake gizmo; make arg1; make arg2
../
в каждом каталоге . На мой взгляд, он что-то разрабатывает, и ему просто нужно./file
часто запускать созданную программу . Я действительно не могу придумать ни одного другого сценария, когда часто нужно запускать локальный файл, и если он не запускает его часто, он не стал бы задавать вопрос (он сказал, что трудно, не невозможно ) (2) на самом деле, но Вы можете передать аргументы в рецепте.Чтобы расширить ответ Занны о интерпретаторах (извините, нет комментариев для комментария): «интерпретатор» для собственных исполняемых файлов (также называемых двоичными файлами ELF) - это динамический загрузчик (
ld.so
), но обычно он не понимает синтаксис, который вы хотите:(кроме того, если вы не вставите символическую ссылку
ld.so
на свой путь, вам все равно придется писать/
s)источник
binfmt_misc
./libexec/ld-elf.so.1
. В Linux это не так просто, как «решить, как запустить двоичный файл»:binfmt_misc
обнаруживает формат файла по магическим числам (ELF, сценарий shebang, CIL). После этогоbinfmt_elf
вызывается обработчик. Он анализирует заголовки и разделы ELF;.interp
раздел содержит путь динамического загрузчика; этот загрузчик запускается ядром, выполняет перемещение и переходит на_start
. В FreeBSD (не уверен в других) нет binfmt, но принцип +/- похож.ld.so
не имеет.interp
и является статически связанным, что означает, что ему не нужно, чтобы другой динамический компоновщик / загрузчик разрешал свои внешние символы и делал математику перемещения.Если мы можем начать настройку
Большинство современных дистрибутивов уже включают ~ / .local / bin в $ PATH (добавьте
export PATH="$HOME/.local/bin:$PATH"
в свой,~/.profile
если ваш нет). Тогда вы можете использоватьx file
для запуска./file
.Не пытайтесь определить
.
команду. Команда. script
уже выполняетсяscript
в текущей оболочке. Это позволяетscript
определять переменные среды для текущей оболочки.источник
exec "$@"
.$ (ln -s /bin/ls my-ls && exec my-ls) # bash: exec: my-ls: not found
shift $1
; простоexec ./"$@"
. (2) Поскольку вы говорите о сценарии оболочки, советовать людям не определять.
команду немного бессмысленно / вводить в заблуждение , поскольку невозможно создать файл с именем.
. (Можно и очень нежелательно определять псевдоним или вызываемую функцию оболочки.
.)Если нам разрешено создавать вспомогательные скрипты, вы можете создать помощника, который добавит pwd в PATH, а затем запустите
Это позволяет избежать добавления "." к пути и загрязнению вашего .profile каждым путем, который вы в какой-то момент захотите запустить.
Мы можем продвинуться к этому подходу, сделав помощника, который запускает новую оболочку с измененной переменной PATH. Если он принимает каталог в качестве параметра (используя pwd по умолчанию), он будет функционировать как a,
pushd
который редактирует путь. Возможно, вам следует помнить, что любые изменения в других переменных среды будут потеряны при выходе из подоболочки, но в долго работающей оболочке переменная PATH не будет загромождена. В зависимости от ваших рабочих процессов это может быть выгодно.Но я думаю , если вы хотите работать с ним можно взломать
pushd
иpopd
поэтому они могут сделать те же изменения в пути , не без подоболочку , который потеряет другие изменения.(Вы не можете сделать то же самое,
cd
потому что у него нет аналогаpopd
.)Вы также можете создать выделенную пару помощников, чтобы просто нажимать и извлекать записи PATH. Что работает лучше всего, действительно зависит от ваших моделей использования.
источник
cd
, но это еще не все: создайте файл как.dircmds
и взломайте,cd
чтобы сделать команды, определенные как./.dircmds
недоступные, непосредственно перед переключением и доступные сразу после переключения.Вы можете использовать
. script.sh
синтаксис, пока скрипт, который вы хотите выполнить, находится в текущем каталоге.Вы также можете добавить префикс к интерпретатору, например, sh или bash. пример:
bash script.sh
источник
. script.sh
сломается, если скрипт содержитexit
неожиданные эффекты, например, если он переопределил PATH «временно»; это также работает только для сценариев для вашей текущей оболочкиexit
вы можете поместить его в круглые скобки, то есть в подоболочку, но это правда, это все равно будет только для сценариев в той же оболочке.