Прежде всего, идентификатор открытого ключа и идентификатор закрытого ключа одинаковы, поэтому ваши имена файлов должны совпадать с началом.
Во-вторых, вам фактически не нужно создавать резервные копии открытого ключа , Просто импортируйте закрытый ключ (который содержит как закрытый, так и открытый ключ), и импортируются как закрытый, так и открытый ключи.
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>
То, о чем вы просите, может быть сделано с помощью 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
Примечание. Это также может быть сделано с помощью выражения if, как показано в других ответах. Я придерживался логических операторов и скобок здесь, потому что это еще один способ сделать это, и я хотел показать, как это сделать.
Мне кажется, что вы неправильно поняли задачу. Я предполагаю, что скрипт - это что-то, что sysadmin будет использовать для проверки пользователей, так что «Кто вы?» И проверяя, что пользователь, запускающий скрипт, ввел свое собственное имя пользователя (это то, что пытается сделать ваш скрипт) не то, что вы
Я думаю, что ответ janos и ответ десерта делают именно то, что вы хотите, и у меня нет лучшего ответа. Но вот несколько советов по отладке вашего скрипта ...
Вы использовали [, который является оболочкой. Вы можете увидеть некоторую информацию об этом, запустив 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. Вы можете исправить синтаксическую ошибку следующим образом: Вы также могли бы избежать назначения дополнительной переменной, выполнив этот тест , но краткость не всегда дает ясность, особенно в сценариях оболочки, и, кроме того, это не то, что вы действительно хотите сделать, потому что пользователь, запускающий сценарий, должен войти в систему для запуска скрипта, поэтому даже синтаксически корректная версия вашего скрипта будет проверять только то, что пользователь набрал свое имя пользователя правильно, чего не задает задача. read является встроенной командой Bash. Вы можете получить информацию об этом, запустив help read. Когда вы используете команду read, вы, вероятно, захотите использовать опцию -r, чтобы избежать каких-либо обратных косых черт на входе, выступающих в качестве экранов. Кроме того, вместо echo запроса пользователя вы можете использовать опцию read -p и записать приглашение после -p для более сжатого сценария. делает то же самое, что и Вы также не должны просто указывать переменную, так как read автоматически вводит ввод в переменную REPLY. Вы можете проверить это: Конечно, вы часто хотите назвать переменную. Я думаю, что user был хорошим выбором для этого. if также является встроенной оболочкой, поэтому вы можете узнать об этом, запустив help if. Вы увидите, что он проверяет команду после нее и выполняет ветвь then, если статус выхода этой команды равен нулю (т.е. она была успешной). Ответ janos использует if без test или [, просто собирая статус выхода grep: выполняет поиск выхода who -u, чтобы увидеть, начинается ли какая-либо строка с значение переменной $user. ^ - начало строки, а опция -q подавляет вывод. Статус выхода grep равен нулю, если он находит совпадение, поэтому, если $user найден, ветка then структуры if будет выполнена, но если grep не сможет найти что-либо, else будет выполняться (если она существует). if [ "$user" = "$name" ]
if [ "$user" = "$(whoami)" ]
read
echo "Who are we checking on? "
read -r user
read -rp "Who are we checking on? " user
read -rp "Who are we checking on? "
echo "$REPLY"
if
who -u | grep -q "^$user "
Поскольку проверки состояния выхода достаточно, я не думаю, что вам нужны [ или 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
То, о чем вы просите, может быть сделано с помощью 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
Примечание. Это также может быть сделано с помощью выражения if, как показано в других ответах. Я придерживался логических операторов и скобок здесь, потому что это еще один способ сделать это, и я хотел показать, как это сделать.
Мне кажется, что вы неправильно поняли задачу. Я предполагаю, что скрипт - это что-то, что sysadmin будет использовать для проверки пользователей, так что «Кто вы?» И проверяя, что пользователь, запускающий скрипт, ввел свое собственное имя пользователя (это то, что пытается сделать ваш скрипт) не то, что вы
Я думаю, что ответ janos и ответ десерта делают именно то, что вы хотите, и у меня нет лучшего ответа. Но вот несколько советов по отладке вашего скрипта ...
Вы использовали [, который является оболочкой. Вы можете увидеть некоторую информацию об этом, запустив 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. Вы можете исправить синтаксическую ошибку следующим образом: Вы также могли бы избежать назначения дополнительной переменной, выполнив этот тест , но краткость не всегда дает ясность, особенно в сценариях оболочки, и, кроме того, это не то, что вы действительно хотите сделать, потому что пользователь, запускающий сценарий, должен войти в систему для запуска скрипта, поэтому даже синтаксически корректная версия вашего скрипта будет проверять только то, что пользователь набрал свое имя пользователя правильно, чего не задает задача. read является встроенной командой Bash. Вы можете получить информацию об этом, запустив help read. Когда вы используете команду read, вы, вероятно, захотите использовать опцию -r, чтобы избежать каких-либо обратных косых черт на входе, выступающих в качестве экранов. Кроме того, вместо echo запроса пользователя вы можете использовать опцию read -p и записать приглашение после -p для более сжатого сценария. делает то же самое, что и Вы также не должны просто указывать переменную, так как read автоматически вводит ввод в переменную REPLY. Вы можете проверить это: Конечно, вы часто хотите назвать переменную. Я думаю, что user был хорошим выбором для этого. if также является встроенной оболочкой, поэтому вы можете узнать об этом, запустив help if. Вы увидите, что он проверяет команду после нее и выполняет ветвь then, если статус выхода этой команды равен нулю (т.е. она была успешной). Ответ janos использует if без test или [, просто собирая статус выхода grep: выполняет поиск выхода who -u, чтобы увидеть, начинается ли какая-либо строка с значение переменной $user. ^ - начало строки, а опция -q подавляет вывод. Статус выхода grep равен нулю, если он находит совпадение, поэтому, если $user найден, ветка then структуры if будет выполнена, но если grep не сможет найти что-либо, else будет выполняться (если она существует). if [ "$user" = "$name" ]
if [ "$user" = "$(whoami)" ]
read
echo "Who are we checking on? "
read -r user
read -rp "Who are we checking on? " user
read -rp "Who are we checking on? "
echo "$REPLY"
if
who -u | grep -q "^$user "
Поскольку проверки состояния выхода достаточно, я не думаю, что вам нужны [ или 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