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

Механизм шифрования:

использует значения по умолчанию Cryptsetup с LUKS для AES в режиме XTS_plain64, 256-битный ключ с хешированием пароля SHA1 проходит через 1 секунду PBKDF2, поэтому количество итераций зависит от вашего Сила процессора. Системная (/ или «корневая»), домашняя область и область подкачки объединены в один зашифрованный логический том. Загрузочный раздел должен быть отдельным в Linux FDE, независимо от того, какая конфигурация или дистрибутив, и для большинства он также должен быть незашифрованным (исключения: Arch и Gentoo), поэтому / boot открыт для злоумышленников с физическим доступом к компьютеру. Ubiquity создает загрузочный раздел ext2 размером около 250 МБ. [Источник - имеет хороший обзор]

blockquote>

Поддерживаемые разрешения доступа в основном «заблокированы» и «разблокированы»; любой, у кого есть действительная фраза-пароль, может разблокировать и прочитать любой файл (при условии физического доступа = root-доступ).

24
задан 25.10.2019, 02:44

6 ответов

Вы можете использовать аргументы -e или -x для запуска команды внутри недавно запущенного терминала, но это не совсем то, что вам нужно.

0
ответ дан 25.10.2019, 02:45
  • 1
    близко, но не совсем то, что я ищу. В этом случае одной из проблем является то, что после выполнения и завершения терминал немедленно закрывается. Итак, допустим, я хочу ярлык «ls ~ / notes», он закроется, прежде чем я смогу просмотреть вывод. – Guido 25.10.2019, 02:45
  • 2
    Если бы было решение для этого, это решило бы большинство случаев, которые я ищу. – Rob Juurlink 25.10.2019, 02:45

Два ответа, которые мне больше всего понравились, - это использовать expect и , этот , где они рекомендуют использовать флаг --init-file либо в шебанге, либо при выполнении терминала:

#!/bin/bash --init-file
commands to run

... и выполнить его как:

xterm -e /path/to/script
# or
gnome-terminal -e /path/to/script
# or
the-terminal -e bash --init-file /path/to/script/with/no/shebang

expect, вероятно, лучшее решение (по причинам, которые я обрисую), за исключением того, что я не могу контролировать, установлено ли оно в моем целевая среда.

Проблема, с которой я столкнулся с bash --init-file и gnome-terminal --command в качестве хака для решения этой проблемы, заключается в том, что оболочка не имеет доступа к STDIN при выполнении сценариев инициализации. Если, например, я хочу запустить что-то, что потребует ввода данных пользователем (ftp, telnet и т. Д.), Но потом оставить родительскую оболочку включенной, это не сработает; единственное исключение, которое я видел до сих пор, это ssh:

xterm -e /bin/bash --init-file <(echo 'ssh -X some-machine')

... но что мне нужно, сложнее, чем этот пример с игрушкой. В любом случае, я надеюсь, что материал --init-file будет полезен всем, кто читает этот вопрос.

0
ответ дан 25.10.2019, 02:45

Ответ Ундрука хорош, но, возможно, немного тяжеловес для этой задачи.

Вот скрипт, который пишет скрипт на основе своих аргументов.

#!/bin/sh
# terminal-plus-command: start a subordinate terminal which runs
# the interactive shell after first running the command arguments

tmpscript=/tmp/tmpscript.$
echo "#!$SHELL" > $tmpscript
echo "$@" >> $tmpscript
echo exec "$SHELL" >> $tmpscript
chmod +x $tmpscript
gnome-terminal --command $tmpscript
rm -f $tmpscript

Если вы не занимались программированием оболочки, здесь, похоже, больше магии, чем есть. Сначала я назову временный файл для хранения скрипта, где $ - это идентификатор процесса оболочки, выполняющей этот скрипт. Метафора /tmp/something.$ используется в случае, если два экземпляра этого скрипта выполняются одновременно, они не будут пытаться использовать один и тот же временный файл.

Переменная $SHELL установлена ​​на имя оболочки, в которой выполняется скрипт. Если вы используете / usr / bin / bash, возможно, вы захотите использовать его и в мини-скрипте.

"$@" является идиомой оболочки для «интерполировать все мои аргументы, цитируя их при необходимости». Этот специфический синтаксис заставляет

script.sh 'my file' your\ file

интерполировать аргументы как два элемента

"my file" "your file"

вместо четырех, которые $@ будут давать

"my" "file" "your" "file"

Последний В строках сценария gnome-терминал запускает мини-сценарий, а затем запускает интерактивную оболочку. Когда gnome-терминал завершает работу, временный скрипт удаляется, потому что мусор не охлаждается.

Последняя строка не является частью мини-скрипта, она показывает, что мини-скрипт работает. Если приведенный выше 11-строчный скрипт находится в файле с именем rt.sh, то chmod делает его исполняемым, а затем выполняется.

$ chmod +x rt.sh && ./rt.sh echo hello world

Результатом всего этого будет терминал гнома, который запускается, отображает

hello world

в первой строке и затем запускает интерактивную оболочку:

msw@myhost:~$
0
ответ дан 25.10.2019, 02:46
  • 1
    e.m.fields: я вам это комментировал. – b. phillips 25.10.2019, 02:46
  • 2
    ты жжешь. спасибо за аннотации, такая помощь делает барьер для входа в скрипты намного более доступным – masato-san 25.10.2019, 02:46
  • 3
    Я думаю, что ваш сценарий может быть уменьшен до gnome-terminal -x sh -c "echo hello world; bash", о котором я не думаю, что вопрос задается. – Nthalk 25.10.2019, 02:47
  • 4
    Это выглядит круто. Можете ли вы объяснить, что здесь происходит? – Nthalk 25.10.2019, 02:47

Предложение Эндрюка очень хорошо и работает для меня, однако команда жестко запрограммирована в скрипте, и если вы измените размер окна терминала, он не будет работать хорошо. Используя его код в качестве основы, я добавил возможность посылать сценарию myprompt команду в качестве аргумента, и этот скрипт правильно обрабатывает изменение размера окна терминала.

#!/usr/bin/expect

#trap sigwinch and pass it to the child we spawned
#this allows the gnome-terminal window to be resized
trap {
 set rows [stty rows]
 set cols [stty columns]
 stty rows $rows columns $cols < $spawn_out(slave,name)
} WINCH

set arg1 [lindex $argv 0]

# Get a Bash shell
spawn -noecho bash

# Wait for a prompt
expect "$ "

# Type something
send $arg1

# Hand over control to the user
interact

exit

и запустите Терминал Gnome с:

gnome-terminal -e "~/bin/myprompt \"my text to be posted\""
0
ответ дан 25.10.2019, 02:47

Если я правильно понимаю, вы хотите, чтобы ваша первая строка ввода была предварительно заполнена содержимым, которое вы передаете в командной строке gnome-терминала.

Я не знаю, как именно это сделать с помощью bash, но вот кое-что, что близко. В вашем ~/.bashrc добавьте следующую строку в самом конце:

history -s "$BASH_INITIAL_COMMAND"

Запустите gnome-terminal -x env BASH_INITIAL_COMMAND='my text to be posted' bash и нажмите Up в приглашении, чтобы вызвать текст.

Также обратите внимание, что если вы поставите set -o history с последующими комментариями в конце вашего .bashrc, они будут внесены в историю при запуске bash, так что вы можете использовать их в качестве основы для редактирования, достигнув их с помощью Up и удаление начальных #.

0
ответ дан 25.10.2019, 02:47
  • 1
    Хотя это не совсем то решение, которое я искал, оно само по себе интересно. – hisdrewness 25.10.2019, 02:48

Вы можете сделать это с ожидайте ( установить ). Создайте и сделайте исполняемый файл ~/bin/myprompt:

#!/usr/bin/expect -f

# Get a Bash shell
spawn -noecho bash

# Wait for a prompt
expect "$ "

# Type something
send "my text to be posted"

# Hand over control to the user
interact

exit

и запустите Gnome Terminal с:

gnome-terminal -e ~/bin/myprompt
0
ответ дан 25.10.2019, 02:47
  • 1
    Супер спасибо Я успешно интегрировал это в сценарий оболочки, который вызывает инструмент интеграции данных Pentaho. Затем я добавил вызов этого скрипта в панель запуска Unity в 11.10, и он работает как шарм. – Stijn de Witt 25.10.2019, 02:48
  • 2
    +1 за использование Expect. Я использовал это в течение многих лет, чтобы помочь автоматизировать многие вещи. – Jasper 25.10.2019, 02:48
  • 3
    Этот долго мучил меня, я почти не мог вспомнить, каков был предполагаемый вариант использования. Итак, для пояснения: я бы хотел сделать что-то вроде «gnome-terminal -e ls», но главное - оставить окно открытым. Таким образом, в основном это ярлыки для открытия терминала и запуска команд оболочки. Это проясняет вопросы против ответов aendruk / msw? – user2800708 25.10.2019, 02:49
  • 4
    Это здорово. Я надеялся, что будет какой-то простой (ish) ответ, основанный на функциональности gnome-терминала по умолчанию, но похоже, что это отвечает работе. – AlikElzin-kilaka 25.10.2019, 02:49
  • 5
    Если все, что вам нужно, это чтобы терминал оставался открытым после команды, есть гораздо более простые решения . – Amr ElAdawy 25.10.2019, 02:49

Теги

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