Как стать автором
Обновить

Комментарии 77

Вывод: пишите скрипты для bash, сидите в интерактиве в zsh!

А вообще если не следишь за тем, что пишешь то ССЗБ. И не важно на "!!" ты нарвёшься или ещё на какой функционал.
Во всём этом «пробел перед командой» самый странный и неприятный.

Вообще, я бы за дизайн "!!", который раскрывается молча после нажатия enter, сильно бил бы. Если бы оно на нажатие "!!" меняло бы командную строку, это была бы куда менее ужасная и куда более полезная функция (как и все остальные! команды).
Возможно. Но мб кто-то их использует для не-интерактивного shell'а…
Ну либо хотябы спрашивало
Я обычно курсором повторяю предыдущую команду и дописываю sudo. Мне кажется, что это по времени немногим больше.
Всё же есть значительная часть людей, которые очень не любят тянуть руку к мышке, мне даже лень до TrackPoint'а руку сместить. Я и далеко не одинок.
А зачем мышь? [стрелка-вверх][home]sudo [enter]
Я отвечал на конкретный пост. Прежде чем умничать тут читайте всю ветку.

> Я обычно курсором повторяю предыдущую команду
> А зачем мышь?

Не находите противоречий?
Простите, что вмешиваюсь, но курсор — это понятие более общее, чем «курсор мыши». В частности, стрелки на клавиатуре в постсоветской литературе называют «клавиши управления курсором».

А вот тот зелёный/чб/мигающий квадратик/палочка — это тоже курсор.
Если речь идёт о курсоре, которым можно что либо выделить, то речь идёт либо о перемещении манипулятора типа «мышь»/TrackPoint/TouchPad, либо комбинации клавиш для перемещения курсора в мультиплексоре, например screen. Но в случае мультиплексора работы нужно совершить ещё больше.
А уж нажатие стрелки вверх на клавиатуре для гулянья по истории, уж ни как не входит в манипуляцию курсором.
Если я в отсутствие любого sreen'а, в обычном баше с readline, набираю текст, а потом делаю ctrl-w, это манипуляция с курсором?
Поискал тщательно, не нашёл. Я отвечал на конкретный комментарий, и чтение ветки никоим образом не меняет его смысла. А раз речь идёт о командной строке, то было бы логично предположить, что имеется в виду текстовый курсор, а не курсор мыши, о чем вам написали ниже. Так что прежде чем умничать, вспомните что с помощью текстового курсора тоже можно выделять текст. А тов. Meklon просто немного неточно сформулировал свою мысль, но почему-то её поняли все кроме вас.
Виноват)) тяжёлое детство, DOS и командная строка) ну привык я стрелки курсором называть. Это было весьма распространённое название этого блока клавиш. А сейчас их по-другому называют?
Ниже уже ответили) курсор клавиатуры)
7 нажатий: <s> <u> <d> <o> <space> <!> <!>
7 нажатий: <↑> <Home> <s> <u> <d> <o> <space>

Бонус: с большей вероятностью можно заметить, что повторил какой-нибудь rm -rf / some/folder.
Ещё не забываем, что нужно зажать Shift для <!>
На многих ноутбуках кнопка Home запрятана очень далеко, а очень она требует нажатия Fn клавиши.
И количество нажатий не совсем правильно считать, так как нажать одну и ту же клавишу два раза гораздо быстрее, нежели нажимать две разные клавиши.
Лично мне удобнее не тянутся к стрелочке и home, а напечатать "!!". Но это лично мне.

rm -rf / some/folder у меня отсекает zsh — он разворачивает "!!" и я могу посмотреть полностью команду и убедиться, что там нет ничего страшного.
На многих ноутбуках кнопка Home запрятана очень далеко

Именно поэтому для дописывания sudo я возвращаюсь в начало команды с помощью Ctrl+A. Оно всегда под рукой, не надо думать, где на текущей машине кнопка Home.
Век живи — век учись. Спасибо огромное за Ctrl+a
Как всегда, zsh можно настроить и так, и так. Кстати, у меня команда, начинающаяся с пробела, удаляется из истории с помощью функции zshaddhistory (не помню, чем меня не устроила настройка HIST_IGNORE_SPACE). А вообще zsh имеет кучу способов удаления из истории:
  • $HISTORY_IGNORE: переменная, содержащая шаблон, под который должна подпадать игнорируемая команда
  • setopt HIST_IGNORE_SPACE: настройка, заставляющая игнорировать командную строку, начинающуюся с пробела или использующую обычный (есть ещё suffix и глобальные) alias, начинающийся с пробела
  • setopt HIST_NO_FUNCTIONS и setopt HIST_NO_STORE — игнорируют командную строку, в которой есть определение функции или вызов fc
  • zshaddhistory: если данная функция завершится с кодом 1, то строка не будет сохранена, а если 2, то она не будет сохранена в файле, но будет в памяти.
Во всех случаях вы можете один раз получить команду повторно, независимо от того, была ли она сохранена в файле или в памяти или не была сохранена ни там, ни там.
У меня zsh при нажаетии enter показывает всю команду с развернутым "!!" и только потом я могу нажать enter еще раз и команда выполнится.
Это настройка HIST_VERIFY (кстати, оказывается в bash она тоже есть: habrahabr.ru/post/246375/#comment_8188087) и судя по man zshoptions по‐умолчанию она не включена (как и в bash, кстати). Только zsh всегда даёт вам редактировать ранее введённую команду, а bash — нет.
(просто скопипастите это пример в шелл)

@[~]$ echo NO ROOT PLEASE
NO ROOT PLEASE
@[~]$  echo do it with sudo
do it with sudo
@[~]$ sudo !!
sudo  echo do it with sudo
Password:

Почему? Потому что пропуск команд с пробелом вначале по умолчанию выключен в bash (хотя мейнтейнеры каких-нибудь дистрибутивив могут и включить).

P.S. Оказывается, хабрапарсер заменяет восклицательные знаки в количестве больше одного и предваряющие их пробельные символы тремя восклицательными знаками, смотрите:! (один),!!! (два),!!! (три),!!! (четыре),…
Кроме проблемы с пробелом, здесь кроется еще одна — сильная жесткая связь с предыдущей командой. При развитии скрипта может появится потребность что-то добавить между или перенести кусок из этого скрипта в другой и таким образом все поломать.

Похожая неприятность поджидает пользователей математических пакетов — там тоже обычно есть подстановка для интерактивного режима, обозначающая «последний ответ» — в maxima это %, в maple — ans и так далее.
Не думаю, что много людей это использует в скриптах, это для интерактивного режима сделано. Тем более, что (из «man bash»):
… This feature is enabled by default for interactive shells, and can be disabled using the +H option to the set builtin command (see SHELL BUILTIN COMMANDS below). Non-interactive shells do not perform history expansion by default.
В каждом инструменте можно найти возможность отстрелить себе ногу, это не повод не пользоваться фичами этого инструмента
А есть вообще прецеденты использования "!!" в скриптах, а не в интерактивном сеансе?
НЛО прилетело и опубликовало эту надпись здесь
А как это включить?
В .zshrc plugins= добавить sudo в списке расширений для oh-my-zsh.
Спасибо огромное!(!)
На вкус, запах и цвет все фломастеры разные.
Любой пробел с какой либо фичей может восприниматься в определенной ситуации как недоработка. Это просто говорит об отсуствии большего опыта, а пост на невратический срыв.

Хотя в вашем посте и рациональное звено — не стоит злоупотреблять чем-либо. Умеренность — это задаток равновесия.
А большой опыт — это сколько? Десять лет эксплуатации? 15? 20? Про диагнозы по переписке я тактично умолчу.
Больший опыт, это когда после одного просмотра кода сразу понятно почему он не правильно функуионирует. Это когда вы на автомате помните, что пробелы оставлять не нужно, п текст просматриваете с режимом покпза спецсимволов,
А. То есть идеальный сисадмин не делает ошибок. Так же как и идеальный программист.

Ясно, идея понятна, спасибо.
Нет. Ничего вам не понятно. И сисадмин и программист с каждым разом делают меньше ошибок, создавая код, способный работать с первого раза.
Круто. То есть чудаки с тестами и лузеры с CVE, так?
Тесты логично создавать, когда код содержит множество входнях параметров и зависимостей и не возможно при любом изменении быть уверенным, что изменения не привели к коррекции ранее правильно работающих участков обработки.
Тесты логично создавать для любого кода, который будет изменяться. То есть для любого кода, который будет использоваться больше одного раза.
Спасибо, это очень важно.

Теперь к первоначальному тезису о том, что чем опытнее сисадмин или программист, тем меньше он ошибок делает. Рост числа CVE говорит о том, что или программисты становятся всё хуже, или ваша идея не верна.

Hint: если бы сисадмин всю свою жизнь делал одно и то же, то да. А чаще всего есть такая штука, как рост квалификации и специализация (не говоря уже про дрифт технологий).
shopt -s histverify в .bash_profile, и команда из истории будет не сразу выполнятся, а просто выводиться.
А вот за это спасибо. Не знал.
Никогда не пользовался "!!", но разве (по крайней мере в zsh) не для этого есть tab, который развернёт "!!" и позволит её просмотреть перед выполнением.
sudo спрашиваает пароль.

!!! печатает полную команду перед её исполнением.
У меня судо проверяет ssh-ключ. Плюс, это происходит первый раз, а потом в течение нескольких минут судо минут судо идёт без авторизации.
Как настраивать? А то как-то тупо получается — сервер внутрь пустил без вопросов, а потом просить пароль.
Отдельный auth-модуль. Требует проброса ssh-агента.
Долго возиться? В принципе, уже сомневаюсь стоит ли заморачиваться ради одного пароля)
С пакетированием и правильным выкатыванием у нас заняло пару-тройку дней. Жизнь стала сильно краше, потому что топтать пароль по каждому чиху (на разных серверах — по новой и по новой) страшно задалбывает.
Ну, с моим десятком машин это не критично)
А теперь расскажете нам о вреде 'sudo -s'?

Audit trail не предлагать, можно удобно логировать с привязкой к пользователю.
Зависит от ситуации. Если пользователи равноправны, а конфигурация управляется через git, то sudo -s используется преимущественно для диагностики. В условиях паучьего гнезда — любая пролетающая бабочка рушит кластер, это и так понятно.

ssh-ключи при судо просто защищают машину от «странных» вещей, проверяя, что пользователь всё ещё обладает ключом. При том, что у рута отключен логин, это позволяет быть уверенным, что команду запускает именно пользователь, а не забытый в чужом namespace'е tshark.
Логично, спасибо.
4 строчки в конфиг — пароль все еще будет спрашиваться первый раз, но потом 4 часа будет пускать без пароля.

P.S. если ip address сервера меняется пока сокет открыт, то придется руками удалить сокет — rm /tmp/ssh_mux_x_y_z

cat ~/.ssh/config

Host *.my.servers.domain
	ControlMaster auto
	ControlPath /tmp/ssh_mux_%h_%p_%r
	ControlPersist 4h
Это всё жестоко обламывается на злые наты, которые рвут idle коннекты куда непопадя, да и всякие штуки вроде «переткнуться между сетями» портят.
Это верно, но жить можно. Наты на самом деле не так сильно мешают, проброс портов так же замечательно работает.

Что неработает так это escape sequence — (aka ~), что действительно раздражает, но не все люди это используют. В общем я считаю что попробовать очень просто, а решить нравится или нет уже каждый сам.
кипэлайвы, разве, не спасают?
От этого спасают. Зато если в сети потери пакетов, постоянный keepalive вгоняет tcp в такую депрессию, что поджатое окно делает жизнь почти невозможной (не говоря уже про удовольствие ждать, пока сначала keepalive просрётся да перешлётся, а потом уже свои пакетики слать).
В случае с потерей пакетов, я думаю, есть проблемы посерьёзней тормозного ssh.
А вообще. я как-то работал с каналом, где задержка была от 2х секунд. Вспомнил всё, всё что умел в неинтерактивной консоли.
Вот тут писали как это можно относительно просто сделать через pam-ssh-agent-auth.

Но иногда, хоть и не так секьюрно, но проще просто добавить в конце в ваш sudoers-файл для пользователей, заходящих с authorized_key, опцию NOPASSWD:
# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL
# Allow admin user execute anything without password
admin ALL=(ALL) NOPASSWD:ALL

Нужно только помнить, что в этом случае не важно как и когда пользователь авторизовался (со всеми вытекающими), но если единственно возможно только через authorized_key, то почему нет…
Такой вариант плох, потому что забытый процесс после отключения пользователя по-прежнему может юзать sudo без пароля. В случае с проверкой ключа, если в screen'е или просто в bg кто-то что-то забыл, то оно автоматически теряет какие-либо привилегии.
Вы вероятно имеете ввиду второе… Ну я как-бы и писал, что оно не то что бы супер-метод.
И потом, кто же страртует child-«демоны» с tty? А без оного думается мы получим в дочернем процессе, что то типа:
sudo: sorry, you must have a tty to run sudo

Ну, получить/сделать tty не так уж и трудно. Кроме того, речь про самые разные штуки, включая «в скрине» (где tty есть) и т.д.
Defaults requiretty
вот такую строчку убрать и будет счастье.
Странно. У меня в bash в Gnome Terminal и с пробелом команда попадает в историю. На удаленном серваке по SSH не попадает. Это настраивается?
В bash же есть HISTCONTROL и, настраивая ignorespace, нужно понимать последствия.
В zsh есть множество вариантов удаления истории. Но вы всегда можете один раз воспользоваться предыдущей введённой строкой, даже если она и не сохранится потом в истории. В том числе это работает и с !!.
Это звучит, как что-то не правильное. Указание «не сохранять» не работает для предыдущей команды?
Оно работает. Просто есть три места для сохранения: файл, структура в памяти и специальное место, где сохраняется предыдущая строка. В зависимости от настроек вы можете не сохранить строку в памяти и файле либо не сохранить в файле. Но вы не можете не сохранить (точнее можете, но с использованием ряда хаков) предыдущую команду в этом специальном месте. Очень удобно и совершенно правильно: или вам нравится перепечатывать «несохраняемую» строку на каждой ошибке (копирование — вставка не всегда вариант и всегда медленнее стрелочки вверх или эквивалента)?

Команда станет недоступна из истории, как только вы введёте следующую. С моими функциями zshaddhistory и собственным widget'om accept-line (отвечает за исполнение введённой строки, у меня на нём лежит исполнение команд с нестандартным синтаксисом) команда исчезает даже если просто «отправить на исполнение» пустую строку, но вообще-то вам нужно ввести что-то непустое.
НЛО прилетело и опубликовало эту надпись здесь
И никто не вспомнил про bashrc?
sed -i 's/HISTCONTROL=ignorespace//g' .bashrc

(Для новичков: это удалит настройку, отвечающую за игнорирование пробела в истории баша из вашего конфига, нужно только учитывать, что $HISTCONTROL может содержать ещё другие опции, отделённые :.)
Парой коментов выше вижу, надо лучше высыпаться. :)
по тому же принципу все вписывают
alias rm='rm -i'
А мне приходится либо -f добавлять, либо алиас удалять…
всё опасно в том или ином виде. В данном случае, вероятность нарваться на пробел, в целом, достаточно низка. А если реализуется часто, можно отключить опцией.
Вы не поняли. В данном примере вы не «нарываетесь» на пробел. Вы намеренно ставите его там, чтобы строка после пробела не сохранилась в истории. Bash здесь реализует логичное, но неудобное поведение — такую строку переиспользовать средствами bash нельзя никак.
А, нет, автор в конце считает, что пробел там может быть поставлен случайно. Тогда присоединюсь: вероятность нарваться на пробел низкая.
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации

Истории