Отредактируйте свой /etc/ssh/sshd_config
, чтобы он содержал:
Match User [SFTP user]
ForceCommand internal-sftp
Перезапустить sshd
.Если у вас есть несколько пользователей, поместите их всех в строку соответствия пользователей, разделив их запятыми, например:
Match User User1,User2,User3
Ключом к настройке sftp
для запрета доступа к оболочке является ограничение пользователей с помощью параметра ForceCommand
.
На основе ответа на вопрос «Как избежать отправки xsel текста в буфер обмена с пробелом/Enter в конце» Теперь у меня есть обходной путь. Я не знаю, как запустить терминал с текстом в нем, ожидающим нового ввода (, набранного, вставленного ), одним действием(скриптом/командой/ярлыком ), но теперь я могу сделать это за два шага:
bash -c 'printf "%s" "MY_TEXT" | xsel -b' ; konsole
, чтобы отправить этот текст в буфер обмена и открыть терминал, напримерkonsole
(Эти два действия с клавиатурой достигают того, что в исходном вопросе является пунктом № 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 действий с клавиатурой и мышью без необходимости что-либо писать.)
Я хотел бы иметь это с помощью одной команды, но я думаю, что это подходит здесь как дополнительный ответ в любом случае (, а не в теле вопроса ).
Ввод текста или выполнение команды в терминале очень похожи. Во-первых, давайте посмотрим, как мы можем открыть терминал, выполняющий команду.
Чтобы выполнить команду, вы можете сделать 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
). bash
. foo
не будет эхо, пока вы не нажмете клавишу Enter . Вы также можете изменить команду echo foo
на что угодно. Если вы скопировали URL-адрес http://youtube.com/foobar
, вывод xsel -ob
будет содержать завершающую новую строку\n
(— тот же символ, который вы обычно получаете, когда нажимаете Enter ). В зависимости от контекста,есть несколько вещей, которые вы можете сделать:
xsel -ob | head -1 | tr -d "\n"
xsel -ob | tr "\n" " "
. 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
. Если у вас возникнут проблемы с другой оболочкой, пожалуйста, дайте мне знать. Шаг 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 , если вы все еще видите первый, это ошибка вставки от меня. Если вы видите эту заметку, это также может быть моей ошибкой вставки! (но на этот раз не было)