Фоновые команды, выполняемые в неинтерактивных оболочках с отключенным управлением заданиями (как это имеет место в сценариях оболочек), получают stdin
, неявно перенаправленный из /dev/null
.
sh -c 'nc -l 12345 1>nc_out & lsof -p $!'
От POSIX.1-2008 :
2. Язык команд оболочки
[...]
Асинхронные списки
Если команда завершается оператором управления («&»), оболочка должна выполнять команду асинхронно в субкорпусе. Это означает, что что оболочка не должна ждать завершения команды перед выполнением следующая команда.
Формат выполнения команды в фоновом режиме:
command1 & [command2 &...]
Стандартный вход для асинхронного списка перед любым явным выполняется перенаправление, должно считаться назначенным файлу имеет те же свойства, что и /dev/null . Если это интерактивный снаряд, этого не должно быть. Во всех случаях явное перенаправление стандарта входные данные должны переопределять эту операцию.
Когда клиент telnet
устанавливает соединение с localhost
и уже выполняющейся командой nc
через порт 12345
, команда backgrounded nc
, похоже, обнаруживает EOF на своем stdin и начинает процесс завершения работы, так как она принудительно считывается из/dev/null. Возвращаемое нулевое значение команды read
( man 2 read
) указывает на конец файла.
# strace output (from http://pastebin.com/YZHW31ef)
14:32:26 read(0, "", 2048) = 0
14:32:26 shutdown(4, 1 /* send */) = 0
Вот несколько решений для поддержания telnet
в рабочем состоянии и обмена данными с nc
:
sh -c 'nc -l 12345 0<&0 1>nc_out &'
sh -c 'nc -l 12345 0<&- 1>nc_out &'
sh -c 'tail -f /dev/null | nc -l 12345 1>nc_out &'
sh -c 'rm -f fifo; mkfifo fifo; exec 3<>fifo; nc -l 12345 0nc_out &'
-121--102966-
В качестве альтернативы использованию клавиш со стрелками включите клавиши j
и k
для прокрутки списка автозавершений.
Это действие изменяет текущую строку в соответствии с выбранным словом при прокрутке.
Поэтому не нужно нажимать enter, так как курсор все еще находится в режиме вставки в конце замененного слова.
Чтобы включить эту функцию, добавьте ее в файл .vimrc (Благодаря другим в stackoverflow):
inoremap j ((pumvisible())?("\"):("j"))
inoremap k ((pumvisible())?("\"):("k"))
По отдельности, вместо использования клавиш со стрелками, вы можете просто повторить Ctrl-n
, который проклинается через опции ( Ctrl-p
, чтобы пойти назад) и заменить на текущей строке по мере ее перемещения, не нужно вводить
-121--19594-
Запуск сценария через dos2unix перед его выполнением привел к его правильной работе. Я предполагаю, что apt-get считывал дополнительный\r в конце строки как часть имени пакета и, таким образом, искал ldap-auth-client\r (который не существует) вместо ldap-auth-client (который есть).
Упс. Это из вывода ошибки:
http://download.fedora.redhat.com/pub/fedora/linux/core///os/repodata/repomd.xml
^^^
Обратите внимание, что эти пустые элементы соответствуют тем из них, которые предположительно являются undefined переменными оболочки:
yum-config-manager --add-repo \
http://download.fedora.redhat.com/pub/fedora/linux/core/$releasever/$basearch/os/
^^^^^^^^^^^^^^^^^^^^^
Я почти уверен, что $ releasever
должен быть просто 14
и $ basearch
либо i686
, либо x86_64
, так что это должно было быть:
http://download.fedora.redhat.com/pub/fedora/linux/core/14/x86_64/os/
Предполагая, что вы используете 64 -битная система (иначе используйте i686
там).
Весь этот путь, вероятно, уже недействителен; вы можете попробовать:
yum-config-manager --add-repo http://archive.fedoraproject.org/pub/archive/fedora/linux/releases/14/Fedora/x86_64/os/
Но см. обсуждение в комментариях. Предположительно, вы также захотите удалить ранее добавленные фиктивные репозитории.