Вводите имя пользователя в качестве входа: если пользователь вошел в систему, отображает запущенные процессы, принадлежащие пользователю

Прежде всего, идентификатор открытого ключа и идентификатор закрытого ключа одинаковы, поэтому ваши имена файлов должны совпадать с началом.

Во-вторых, вам фактически не нужно создавать резервные копии открытого ключа , Просто импортируйте закрытый ключ (который содержит как закрытый, так и открытый ключ), и импортируются как закрытый, так и открытый ключи.

gpg --import private.key

Но, предположив, что имена файлов по какой-то причине не совпадают, вы можете запустить

gpg yourfile.key, который напечатает что-то вроде:

pub  2048R/1234ABCD 2016-12-31
sub  2048R/5678EFGH 2016-12-31

. Сопоставьте идентификаторы ключей приватного / public keys (в этом примере 1234ABCD).

Если у вас есть тонна ключей, вместо того, чтобы сопоставлять их, может быть проще просто игнорировать ваши экспортированные открытые ключи и восстановить их из ваших личных ключей.

gpg --import private.key
gpg --armor --output <Key Id>-public.key --export <Key Id>
2
задан 16 December 2017 в 12:33

4 ответа

То, о чем вы просите, может быть сделано с помощью oneliner:

read -p"Who are you? " u&&((who -u|grep -q "^$u "&&top -u"$u")||echo "$u is not logged in")

Но поскольку вы попросили сценарий, вот более приятная версия скрипта:

#!/bin/bash read -p "Who are you? " user && (( # prompt for username, save as $user who -u | grep -q "^$user " && # test if user is logged in top -u "$user" ) || # run top with that username echo "$user is not logged in" ) # error message

Объяснения

read -p "Who are you? " user - введите имя пользователя и сохраните его как переменную user && - если это будет успешным, ... (…) - запустите подоболочку и сделайте … в ней - если вы не хотите запускать подоболочку, которую вы можете использовать { …;} вместо этого, пространство, а также точка с запятой являются обязательными who -u | grep -q "^$user " - вызовите who и grep для имени пользователя в начале строки (^ ]) с предыдущим пространством (так что des не соответствует dessert) top -u "$user" - запустите верх с именем пользователя || - если это не удастся, т.е. если пользователь не вошел в систему echo "$u is not logged in" - сообщение об ошибке печати

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

3
ответ дан 18 July 2018 в 01:06

Мне кажется, что вы неправильно поняли задачу. Я предполагаю, что скрипт - это что-то, что sysadmin будет использовать для проверки пользователей, так что «Кто вы?» И проверяя, что пользователь, запускающий скрипт, ввел свое собственное имя пользователя (это то, что пытается сделать ваш скрипт) не то, что вы

Я думаю, что ответ janos и ответ десерта делают именно то, что вы хотите, и у меня нет лучшего ответа. Но вот несколько советов по отладке вашего скрипта ...

test aka [

Вы использовали [, который является оболочкой. Вы можете увидеть некоторую информацию об этом, запустив help [, но по мере того, как эта информация говорит вам, это версия команды test, и больше информации можно найти в help test. Когда я запускаю свой скрипт (который я назвал script), я получаю эти ошибки:

script: line 6: if[zanna == zanna]: command not found script: line 7: syntax error near unexpected token `then' script: line 7: `then'

вам понадобилось три пробела, чтобы отделить команды if и [ от их аргументов. Кроме того, как отметил Сергей в комментарии janos ', оператор == не существовал в test или [. Ubuntu 16.04 использует Bash 4.3. У меня есть Bash 4.4 в 17.10. Вы можете исправить синтаксическую ошибку следующим образом:

if [ "$user" = "$name" ]

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

if [ "$user" = "$(whoami)" ]

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

read

read является встроенной командой Bash. Вы можете получить информацию об этом, запустив help read.

Когда вы используете команду read, вы, вероятно, захотите использовать опцию -r, чтобы избежать каких-либо обратных косых черт на входе, выступающих в качестве экранов.

Кроме того, вместо echo запроса пользователя вы можете использовать опцию read -p и записать приглашение после -p для более сжатого сценария.

echo "Who are we checking on? " read -r user

делает то же самое, что и

read -rp "Who are we checking on? " user

Вы также не должны просто указывать переменную, так как read автоматически вводит ввод в переменную REPLY. Вы можете проверить это:

read -rp "Who are we checking on? " echo "$REPLY"

Конечно, вы часто хотите назвать переменную. Я думаю, что user был хорошим выбором для этого.

if

if также является встроенной оболочкой, поэтому вы можете узнать об этом, запустив help if. Вы увидите, что он проверяет команду после нее и выполняет ветвь then, если статус выхода этой команды равен нулю (т.е. она была успешной). Ответ janos использует if без test или [, просто собирая статус выхода grep:

who -u | grep -q "^$user "

выполняет поиск выхода who -u, чтобы увидеть, начинается ли какая-либо строка с значение переменной $user. ^ - начало строки, а опция -q подавляет вывод. Статус выхода grep равен нулю, если он находит совпадение, поэтому, если $user найден, ветка then структуры if будет выполнена, но если grep не сможет найти что-либо, else будет выполняться (если она существует).

Ответ janos использует только логику оболочки для определения действий для успеха и отказа команды - даже if здесь не требуется:)

test еще раз

Поскольку проверки состояния выхода достаточно, я не думаю, что вам нужны [ или test команда вообще. Если вы действительно хотите использовать его, вы можете использовать что-то вроде

[ -n "$(w -h | grep "^$user ")" ]

. Вся подстановка команды должна быть кавычкой или [ будет жаловаться на слишком много аргументов, если на выходе есть несколько слов (с $user будет одним словом, мы могли бы также использовать grep -o для вывода только совпадения). -n истинно, если строка не пуста.

Альтернативой who -u является w -h. Я не уверен, что более портативный или надежный. Я заметил, что who дает несколько разные результаты в разных эмуляторах терминалов, хотя и не настолько, чтобы остановить работу этого скрипта.

Цитата

В большинстве случаев вы хотите процитировать переменные в скриптах для предотвращения дальнейших расширений. Утилиты, которые вы используете для создания пользователей на Ubuntu, не позволят вам создавать имя пользователя с пробелами или любыми другими символами, которые могут заставить оболочку выполнять расширение, поэтому я не думаю, что строго необходимо указывать переменную в этом скрипте. Тем не менее, возможно, что такие имена пользователей существуют, и хорошая привычка указывать переменные, которые не обязательно должны быть закодированы.

Для полноты, вот моя версия без [ (это по сути то же самое, что и janos '):

#!/bin/bash read -rp "Who are we checking on? " if w -h | grep -q "^$REPLY "; then echo "here's what "$REPLY" is doing:" top -u "$REPLY" else echo "looks like "$REPLY" is not logged in." fi
3
ответ дан 18 July 2018 в 01:06

То, о чем вы просите, может быть сделано с помощью oneliner:

read -p"Who are you? " u&&((who -u|grep -q "^$u "&&top -u"$u")||echo "$u is not logged in")

Но поскольку вы попросили сценарий, вот более приятная версия скрипта:

#!/bin/bash read -p "Who are you? " user && (( # prompt for username, save as $user who -u | grep -q "^$user " && # test if user is logged in top -u "$user" ) || # run top with that username echo "$user is not logged in" ) # error message

Объяснения

read -p "Who are you? " user - введите имя пользователя и сохраните его как переменную user && - если это будет успешным, ... (…) - запустите подоболочку и сделайте … в ней - если вы не хотите запускать подоболочку, которую вы можете использовать { …;} вместо этого, пространство, а также точка с запятой являются обязательными who -u | grep -q "^$user " - вызовите who и grep для имени пользователя в начале строки (^ ]) с предыдущим пространством (так что des не соответствует dessert) top -u "$user" - запустите верх с именем пользователя || - если это не удастся, т.е. если пользователь не вошел в систему echo "$u is not logged in" - сообщение об ошибке печати

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

3
ответ дан 24 July 2018 в 17:20

Мне кажется, что вы неправильно поняли задачу. Я предполагаю, что скрипт - это что-то, что sysadmin будет использовать для проверки пользователей, так что «Кто вы?» И проверяя, что пользователь, запускающий скрипт, ввел свое собственное имя пользователя (это то, что пытается сделать ваш скрипт) не то, что вы

Я думаю, что ответ janos и ответ десерта делают именно то, что вы хотите, и у меня нет лучшего ответа. Но вот несколько советов по отладке вашего скрипта ...

test aka [

Вы использовали [, который является оболочкой. Вы можете увидеть некоторую информацию об этом, запустив help [, но по мере того, как эта информация говорит вам, это версия команды test, и больше информации можно найти в help test. Когда я запускаю свой скрипт (который я назвал script), я получаю эти ошибки:

script: line 6: if[zanna == zanna]: command not found script: line 7: syntax error near unexpected token `then' script: line 7: `then'

вам понадобилось три пробела, чтобы отделить команды if и [ от их аргументов. Кроме того, как отметил Сергей в комментарии janos ', оператор == не существовал в test или [. Ubuntu 16.04 использует Bash 4.3. У меня есть Bash 4.4 в 17.10. Вы можете исправить синтаксическую ошибку следующим образом:

if [ "$user" = "$name" ]

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

if [ "$user" = "$(whoami)" ]

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

read

read является встроенной командой Bash. Вы можете получить информацию об этом, запустив help read.

Когда вы используете команду read, вы, вероятно, захотите использовать опцию -r, чтобы избежать каких-либо обратных косых черт на входе, выступающих в качестве экранов.

Кроме того, вместо echo запроса пользователя вы можете использовать опцию read -p и записать приглашение после -p для более сжатого сценария.

echo "Who are we checking on? " read -r user

делает то же самое, что и

read -rp "Who are we checking on? " user

Вы также не должны просто указывать переменную, так как read автоматически вводит ввод в переменную REPLY. Вы можете проверить это:

read -rp "Who are we checking on? " echo "$REPLY"

Конечно, вы часто хотите назвать переменную. Я думаю, что user был хорошим выбором для этого.

if

if также является встроенной оболочкой, поэтому вы можете узнать об этом, запустив help if. Вы увидите, что он проверяет команду после нее и выполняет ветвь then, если статус выхода этой команды равен нулю (т.е. она была успешной). Ответ janos использует if без test или [, просто собирая статус выхода grep:

who -u | grep -q "^$user "

выполняет поиск выхода who -u, чтобы увидеть, начинается ли какая-либо строка с значение переменной $user. ^ - начало строки, а опция -q подавляет вывод. Статус выхода grep равен нулю, если он находит совпадение, поэтому, если $user найден, ветка then структуры if будет выполнена, но если grep не сможет найти что-либо, else будет выполняться (если она существует).

Ответ janos использует только логику оболочки для определения действий для успеха и отказа команды - даже if здесь не требуется:)

test еще раз

Поскольку проверки состояния выхода достаточно, я не думаю, что вам нужны [ или test команда вообще. Если вы действительно хотите использовать его, вы можете использовать что-то вроде

[ -n "$(w -h | grep "^$user ")" ]

. Вся подстановка команды должна быть кавычкой или [ будет жаловаться на слишком много аргументов, если на выходе есть несколько слов (с $user будет одним словом, мы могли бы также использовать grep -o для вывода только совпадения). -n истинно, если строка не пуста.

Альтернативой who -u является w -h. Я не уверен, что более портативный или надежный. Я заметил, что who дает несколько разные результаты в разных эмуляторах терминалов, хотя и не настолько, чтобы остановить работу этого скрипта.

Цитата

В большинстве случаев вы хотите процитировать переменные в скриптах для предотвращения дальнейших расширений. Утилиты, которые вы используете для создания пользователей на Ubuntu, не позволят вам создавать имя пользователя с пробелами или любыми другими символами, которые могут заставить оболочку выполнять расширение, поэтому я не думаю, что строго необходимо указывать переменную в этом скрипте. Тем не менее, возможно, что такие имена пользователей существуют, и хорошая привычка указывать переменные, которые не обязательно должны быть закодированы.

Для полноты, вот моя версия без [ (это по сути то же самое, что и janos '):

#!/bin/bash read -rp "Who are we checking on? " if w -h | grep -q "^$REPLY "; then echo "here's what "$REPLY" is doing:" top -u "$REPLY" else echo "looks like "$REPLY" is not logged in." fi
3
ответ дан 24 July 2018 в 17:20

Другие вопросы по тегам:

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