Відповіді:
Спочатку потрібно знайти ідентифікатор ключа доданого ключа. Зробіть це командою:
sudo apt-key list
У ньому буде перераховано всі наявні ключі, кожен вигляд має такий вигляд:
pub 1024R/B455BEF0 2010-07-29
uid Launchpad clicompanion-nightlies
Після того, як ви з'ясували, який ключ потрібно видалити, скористайтеся командою, sudo apt-key del <keyid>
де <keyid>
замінено фактичним ключем ключа, який ви хочете видалити зі свого брелока.
$ sudo apt-key del B455BEF0
$ apt-key list | grep clicompan
$
pub rsa4096 2012-05-11 [SC] 8439 .... uid ....
The following signatures couldn't be verified because the public key is not available: NO_PUBKEY
, що мені робити далі?
16.10 короткий ідентифікатор клавіші більше не відображається при використанні команди списку, але насправді це останні 8 символів довгих шістнадцяткових знаків.
Так, наприклад, ідентифікатор ключа для наступного ключа
/etc/apt/trusted.gpg.d/ubuntu-keyring-2012-cdimage.gpg
------------------------------------------------------
pub rsa4096 2012-05-11 [SC]
8439 38DF 228D 22F7 B374 2BC0 D94A A3F0 EFE2 1092
uid [ unknown] Ubuntu CD Image Automatic Signing Key (2012) <cdimage@ubuntu.com>
Ключовим ідентифікатором буде EFE21092
sudo apt-key del "8439 38DF 228D 22F7 B374 2BC0 D94A A3F0 EFE2 1092"
і я вважаю, що безпечніше використовувати весь відбиток пальців, keyid може мати копії (принаймні, коли ви використовуєте PGP для електронних листів, я читаю, що ви повинні ділитися усім своїм відбитками пальців, а не тільки keyid).
Я зробив короткий сценарій, щоб полегшити ситуацію і використовуючи рядок замість id.
Ви можете використовувати мій сценарій, якщо ключ містить унікальну вам відому строку.
наприклад, у моєму випадку для webmin
pub 1024D/11F63C51 2002-02-28
uid Jamie Cameron <jcameron@webmin.com>
sub 1024g/1B24BE83 2002-02-28
Я впевнений, що тільки ключ webmin в моїй системі має, jcameron
ніж я використовую цей скрипт для видалення відповідного ключа.
Я зберегла це як ~/removeAptKey
і запустити його як
sudo ./removeAptKey jcameron
Вихід повинен бути чимось на кшталт
KEYID: 11F63C51
OK
Ось мій сценарій:
#!/bin/bash
function printKeys(){
echo "Installed keys are"
echo ""
sudo apt-key list
}
if [[ $EUID -ne 0 ]]; then
echo "This script must be run as root" 1>&2
exit 1
fi
if [[ $# -eq 0 ]]
then
echo "No key name provided"
exit 1
fi
UNIQUE=$1
sudo apt-key list | grep "${UNIQUE}" -B 1 > result.temp
LENGTH=$(cat result.temp | wc -l)
if [[ ${LENGTH} -gt 2 ]]
then
echo "Attention you found more than 1 key. Use a more specific string."
printKeys
exit 2
fi
if [[ ${LENGTH} != 2 ]]
then
echo "Key not found. Doing nothing."
printKeys
exit 3
fi
KEYID=$(cat result.temp | grep 'pub' | cut -d " " -f 4 | cut -d "/" -f 2)
echo "KEYID: "$KEYID
apt-key del ${KEYID}
rm result.temp
Спочатку я отримую два верхні рядки блоку мого ключа:
sudo apt-key list
: перераховує влучні клавіші як завждиgrep '${UNIQUE}' -B 1
: візьміть лише рядок, що містить унікальний рядок ключа jcameron
та -B 1
рядок раніше> result.temp
: Збережіть його у файлі (який пізніше буде видалено)Якщо це поверне рівно 2 рядки (-> отримав рівно 1 ключ), я рухаюся далі:
grep 'pub'
: Тепер візьміть лише рядок з pup
ідентифікатором ключаcut -d " " -f 4
: візьмемо 4-е слово цього рядка (перше, pub
ніж два пробіли, ніж рядок, який ми маємо після ``)cut -d "/" -f 2
: взяти лише частину після /
І нарешті видаліть цей ключ та очищення
apt-key del ${KEYID}
(у моєму випадку 11F63C51
)rm result.temp
: цей файл більше не потрібен#
в тому випадку, якщо винуватець пункту?
$#
то ні. Він повертає кількість заданих параметрів.
Я знаю, що я можу запізнитися, але просто хотів поділитися цією однорядковою командою, щоб досягти цього.
ПРИМІТКА . Це працюватиме лише тоді, коли вихід є унікальним ключем.
Версії Ubuntu до 16.04 (ОНОВЛЕНО 2018-12-22):
apt-key del $(apt-key list | awk 'NR=='$(apt-key list | grep --line-number --regexp "FOOBAR" | cut --fields 1 --delimiter ":")'{print;exit}' | awk '{print $2}' | cut --fields 2 --delimiter "/")
де FOOBAR
ім'я UID.
Версії Ubuntu з 16.10:
apt-key del $(apt-key list | awk 'NR=='`expr $(apt-key list | grep --line-number --regexp "FOOBAR" | cut --fields 1 --delimiter ":") - 1`'{print;exit}')
де FOOBAR
ім'я UID.
16.04
надану вами команду. awk: line 1: syntax error at or near {
Але кутові дужки відповідають, тому я не впевнений, чому це не працює
apt-key list
змінився формат. Зараз, здається, знову працює. (EDIT: Не забудьте запустити це як суперпользователь)
Software & Updates-->Authentication
, схоже, не працює (він не може видалити будь-який надійний програмний ключ). Натомість довелося використовувати наведені нижче клітинки cmds.