Команда/скрипт для запуска терминала, ввода текста, но не выполнения (ожидание записи, вставки и т. д. текста)

Отредактируйте свой /etc/ssh/sshd_config, чтобы он содержал:

Match User [SFTP user]
ForceCommand internal-sftp

Перезапустить sshd.Если у вас есть несколько пользователей, поместите их всех в строку соответствия пользователей, разделив их запятыми, например:

Match User User1,User2,User3

Ключом к настройке sftpдля запрета доступа к оболочке является ограничение пользователей с помощью параметра ForceCommand.

0
12.04.2021, 01:05
2 ответа

На основе ответа на вопрос «Как избежать отправки xsel текста в буфер обмена с пробелом/Enter в конце» Теперь у меня есть обходной путь. Я не знаю, как запустить терминал с текстом в нем, ожидающим нового ввода (, набранного, вставленного ), одним действием(скриптом/командой/ярлыком ), но теперь я могу сделать это за два шага:

  1. Используйте ярлык, связанный с bash -c 'printf "%s" "MY_TEXT" | xsel -b' ; konsole, чтобы отправить этот текст в буфер обмена и открыть терминал, напримерkonsole
  2. Ctrl -V для вставки текста из буфера обмена в терминал (или Ctrl -Shift -V)

(Эти два действия с клавиатурой достигают того, что в исходном вопросе является пунктом № 1. Примером того, как это может быть полезно, является загрузка аудио с YouTube:(#1)bash -c 'printf "%s" "youtube-dl -f bestaudio[ext=m4a]" | xsel -b' && konsoleкопирует в буфер обмена необходимую команду и открывает терминал где (#2 )его можно вставить, таким образом появится окно для добавления ссылки на YouTube с другим (#3 )копировать+ (#4 )вставить --или, может быть, просто одно перетаскивание (это #3 ), затем (#4/5 )Enter. В общей сложности 4 или 5 действий с клавиатурой и мышью без необходимости что-либо писать.)

Я хотел бы иметь это с помощью одной команды, но я думаю, что это подходит здесь как дополнительный ответ в любом случае (, а не в теле вопроса ).

1
28.04.2021, 22:53

Как запустить терминал с текстом, набранным внутри?

Запустите команду в терминале:

Ввод текста или выполнение команды в терминале очень похожи. Во-первых, давайте посмотрим, как мы можем открыть терминал, выполняющий команду.

Чтобы выполнить команду, вы можете сделать konsole -e MY_COMMAND.
Конечно, это не то, что вы хотите, но это поможет.
Сначала я должен сказать, что нет официальной опции для этого в konsoleили любом другом терминале, который я видел, но мы можем сделать его… на основе функции konsole -e.
В настоящее время я знаю только, как это сделать с gnome-terminalи с konsole, и, вероятно, есть аналогичный способ сделать это с другими эмуляторами терминала.

Проведя несколько тестов, я заметил большую проблему:konsole -eостанавливается после выполнения команды:konsole -e sleep 10отображает терминал konsoleв течение 10 секунд без возможности запуска команды оболочки, а затем закрывается сам.
Но мне нужно, чтобы терминал konsoleоставался открытым, если я хочу выполнить какие-то действия внутри него. Почему это так? Я думаю, что это может иметь смысл в некоторых контекстах, таких какkonsole -e top(диспетчер задач )илиkonsole -e vim(текстовый редактор ), и выход konsole, когда вы выходите vim(, тогда этот vimведет себя как графический интерфейс. текстовый редактор, который можно закрыть, напримерgedit).
У меня такая же проблема с st -e MY_COMMANDили gnome-terminal -- MY_COMMAND.
Итак, я увидел этот пост , и он точно решает проблему (, за исключением того, что он сделан только для gnome-terminalи xterm, поэтому может быть или не быть аналогичного решения дляkonsole).

Во-первых, давайте создадим функцию для запуска gnome-terminalили konsole, которая не завершает работу после выполнения чего-либо:

bash_in_gnome_terminal(){
    local IFS
    printf -v cmd %q ". ~/.bashrc; set -m; $*"
    gnome-terminal -- bash -c "bash --rcfile <(echo $cmd)"
}

bash_in_konsole(){
    local IFS
    konsole -e bash --rcfile <(printf '. ~/.bashrc; set -m; %s\n' "$*")
}

Вы можете проверить это с помощью bash_in_konsole 'echo foo', и вы должны увидеть что-то вроде:

foo
username@computer:~$

Введите текст с помощьюtmux:

Сначала я подумал о xdotoolдля ввода текста, но могут возникнуть некоторые проблемы, если окно konsoleне сфокусировано. Обычно tmuxпредварительно не устанавливается -. В дистрибутиве на основе Debian -команда для его установки sudo apt-get install tmux. На самом деле tmuxимеет функцию send-keys. Конечно, если это с tmux, вы должны запустить сеанс tmux. Возможно, вам нужно будет сначала установить tmux. Попробуйте это, если хотите понять, как это работает:

  • tmuxВведите(Запуск сеанса ).

  • Ctrl -b:(войти в командный режим ).

  • send-keys "echo foo"Введите(введите так, как если бы вы набирали ), вы должны увидеть что-то вроде:

    имя пользователя@компьютер :~$ echo foo

Теперь вы можете объединить две части:
bash_in_konsole 'exec tmux new-session -A -t "temporary" \; run-shell "sleep.1" \; send-keys "C-u" "echo foo" "C-l"'.
Я объясню:

  • execпокидает терминал, когда вы выходите из tmux, вы выходите из konsole.
  • new-session -A -t "temporary"запускает тот же сеанс, если вы использовали команду ранее, но тогда сеансы будут пронумерованы огромными числами.
  • send-keys "echo foo"наберет echo fooв терминале.
    К сожалению, он будет записан дважды (один раз перед приглашением оболочки и один раз внутри него ).
  • "C-u"очистит строку (, необходимую, если вы используете аргументы -A -t "temporary").
  • "C-l"также передается как клавиши, Ctrl -l является официальным bashярлыком для очистки экрана
    (позволяет избежать двойного просмотраecho foo).
    Примечание:Ctrl -Alt -l также работает на некоторых оболочках. Может быть, не на bash.
  • Только fooне будет эхо, пока вы не нажмете клавишу Enter . Вы также можете изменить команду echo fooна что угодно.

Буфер обмена без «Enter» (новой строки )в конце:

Если вы скопировали URL-адрес http://youtube.com/foobar, вывод xsel -obбудет содержать завершающую новую строку\n(— тот же символ, который вы обычно получаете, когда нажимаете Enter ). В зависимости от контекста,есть несколько вещей, которые вы можете сделать:

  • Чтобы получить только первую строку без завершающего пробела:xsel -ob | head -1 | tr -d "\n"
  • Ставить пробелы вместо новой строки:xsel -ob | tr "\n" " ".
    почему пробел , а не "ничего"? Поскольку вы, возможно, скопировали несколько URL-адресов (, несколько строк )и youtube-dl, вы можете загрузить набор видео, разделенный пробелом -.

предупреждение::в вашем случае вы используете youtube-dl, а URL-адрес YouTube может включать отметку времени, например http://youtube.com/foobar&t=21m17s, означающую, что видео автоматически начнется с 21:17, когда вы запустите его в веб-браузере. Также по какой-то причине временные метки могут появляться автоматически. А амперсанд &— это команда bashдля разветвления. Это означает, что его будет трудно вызвать с помощью Ctrl -c , если вы случайно нажали Enter . Вы также можете захотеть экранировать символы, которые обычно экранируются и присутствуют в URL-адресе YouTube, например ?и =, но дляzsh(и, возможно, некоторых других оболочек )только пользователи :с помощью zsh, ?вызывает сообщение об ошибке no matches found.

  • bash, Чтобы избежать только амперсанда:xsel -ob | tr "\n" " " | sed "s/&/\\\\&/g".
  • zsh, Чтобы избежать 3 проблемных символов:xsel -ob | tr "\n" " " | sed "s/\(?\|=\|&\)/\\\\\1/g".
    примечание:большую часть времени я предполагаю, что читатель является пользователем bash, но лично я использую zsh, так что большинство команд должны работать и с zsh. Если у вас возникнут проблемы с другой оболочкой, пожалуйста, дайте мне знать.

Официальное решение, (слияние 3-х предыдущих частей):

Шаг 0:Я предполагаю, что читатель хочет сделать это с помощью команд bash, konsoleи youtube-dl, а введенная команда должна включать содержимое буфера обмена. Я также предполагаю, что это ярлык, сделанный вkonsole(для других читателей, которые просто запустят его в терминале, убедитесь, что вы перезагрузили свой ~/.bashrcпосле его редактирования ).

Шаг 1:Установите tmux, если у вас его нет.

Шаг 2:Скопируйте следующие 7 строк и вставьте их в свой ~/.bashrcфайл (и сохраните файл):

bash_in_konsole(){
    local IFS
    konsole -e bash --rcfile <(printf '. ~/.bashrc; set -m; %s\n' "$*")
}

tmux_in_konsole(){
    bash_in_konsole 'exec tmux new-session -A -t "temporary" \; run-shell "sleep.1" \; send-keys "C-u" "' "$*" '" "C-l"'
}

Шаг 3:Теперь вы можете проверить с помощью tmux_in_konsole "youtube-dl -f bestaudio[ext=m4a] $(xsel -ob | tr "\n" " " | sed "s/&/\\\\&/g")". Это команда, которую вы должны указать для ярлыка konsole. Допустим, вы скопировали URL http://youtube.com/watch?v=foobarlorem&t=10s. Ожидаемый результат:

username@computer:~$ youtube-dl -f bestaudio[ext=m4a] http://youtube.com/watch?v=foobarlorem\&t=10s

Шаг 3-бис:(альтернатива шагу 3 )Если вы не хотите вставлять содержимое буфера обмена, это проще. Вы можете проверить с помощью tmux_in_konsole "youtube-dl -f bestaudio[ext=m4a] ". Ожидаемый результат:

username@computer:~$ youtube-dl -f bestaudio[ext=m4a] 

Шаг ω:(при выходеkonsole)После того, как вы набрали URL-адрес видео, которое хотите загрузить с помощью youtube-dl, и вы набрали , введите , и вы закончили загрузку видео, вы можете выйти из этого терминала.
Чтобы выйти из tmux, просто нажмите Ctrl -bShift -d (. Вы также можете выйти из оболочки, нажав Ctrl -d . ], но это означает, что эта tmuxсессия будет закрыта, и вы снова получите огромные цифры ).
Если вы случайно закрыли konsoleдо окончания загрузки, tmuxпозволит ей работать в фоновом режиме. Но не делайте этого намеренно, потому что это может вызвать некоторые проблемы (, по крайней мере, отображение -, связанное с ), если вы запустите второй экземпляр tmux_in_konsole, пока первая загрузка не закончилась.


Примечание.:Я удалил все остальные части моего комментария, потому что он беспорядочный, и сначала я неправильно понял часть вашего вопроса. Я думаю, что есть еще способ увидеть это, просмотрев историю изменений. Я также храню копию на своем компьютере, если это необходимо.
Примечание:личный zshярлык Ctrl -Alt -l вместо Ctrl -l , если вы все еще видите первый, это ошибка вставки от меня. Если вы видите эту заметку, это также может быть моей ошибкой вставки! (но на этот раз не было)

1
28.04.2021, 22:53

Теги

Похожие вопросы