Portál AbcLinuxu, 30. dubna 2025 11:14
KERNEL="sd*", SYSFS{vendor}="Corsair", SYSFS{model}="Flash*Voyager*", NAME{all_partitions}="myusbkey%n" RUN+="echo lama > /tmp/lama"Po prvotnom uspechu, ktory sa prejavil tym, ze po vlozeni usb klucenky sa mi v /dev/ objavili zariadenia mysubkey* a v /tmp sa objavil subor lama s rovnakym obsahom, som zacal premyslat, ako to vyuzit tak, aby na mna v Xoch vyskocilo okno a vypytalo si heslo. Najprv som spekuloval s pythonom a qt, kym som si poriadne neprecital manual k ssh-add a nenarazil v nom na zmienku o SSH_ASKPASS. A za par desiatok minut bol na svete tento script:
#!/bin/sh # create new file in /etc/udev/rules.d with similar content ( RUN+= must stay!! ) #KERNEL="sd*", SYSFS{vendor}="Corsair", SYSFS{model}="Flash*Voyager*", NAME{all_partitions}="myusbkey%n" RUN+="/home/msk/bin/import_ssh_key.sh signalize" GROUP="your_login" # on which device keys are KEYPARTITION="myusbkey1" # path to keys ( from media root, separated by ',' ) KEYS="keys/id_dsa_key1,keys/id_dsa_key2" # kluce mam na /media/myusbkey1/keys # time of sleep between checks SLEEPTIME=10 # your login USERNAME="msk" # binary of ssh_askpass ASKPASS_BIN=/usr/bin/ssh-askpass-fullscreen PIPEFILE=/tmp/keys_pipe if [ "$1" == "signalize" ]; then # send signal echo "MYUSBKEY_INSERTED:$DEVNAME" > $PIPEFILE # and change ownership, because we was called from udev as root chown $USERNAME $PIPEFILE else # create pipe signalization file rm -f $PIPEFILE # endless cycle while true; do if [ -e $PIPEFILE ]; then # get content of pipe file MSG=$(cat $PIPEFILE) # test if contains message from udev TST=$(echo $MSG | grep "MYUSBKEY_INSERTED:/dev/$KEYPARTITION" | wc -l) if [ "$TST" != "0" ]; then # mount device pmount $KEYPARTITION # for all configured keys IFS=, export SSH_ASKPASS=$ASKPASS_BIN for key in $KEYS; do KEYPATH=/media/$KEYPARTITION/$key # check if key isn't already loaded if [ "$(ssh-add -l | grep $KEYPATH | wc -l)" == "0" ]; then # add key ssh-add $KEYPATH < /dev/null fi done # umount device pumount $KEYPARTITION # done > $PIPEFILE else # no signal from udev, sleep sleep $SLEEPTIME fi fi done fiV /etc/udev/rules.d vznikol novy subor 99-myusbkey.rules s nasledovnym obsahom:
KERNEL="sd*", SYSFS{vendor}="Corsair", SYSFS{model}="Flash*Voyager*", NAME{all_partitions}="myusbkey%n" RUN+="/home/msk/bin/import_ssh_key.sh signalize" GROUP="msk"Pokial netrpite podobnym problemom s usb klucenkou ako ja, pouzite SYSFS{manufacturer} a SYSFS{serial} ( namiesto vendor a model ) podla navodov dostupnych po celom Internete. V KDE autostart spravte link na import_ssh_key.sh tak, aby sa spustil po logine do KDE ( pripadne ineho wm ). Script bude bezat na pozadi a v pripade, ze sa vlozi usb klucenka, pokusi sa naimportovat kluce uvedene v $KEYS. Heslo si vypyta pomocou fulscreen dialogu ( aptitude install ssh-askpass-fullscreen ), ssh askpass je mozne zmenit v $ASKPASS_BIN.
Tiskni
Sdílej:
cat /proc/partitiona pak to raději mountuju ručně.
# path to keys ( from media root, separated by ',' ) KEYS="keys/id_dsa_key1,keys/id_dsa_key2"oddeloval by som to medzerou, potom sa netreba srat s prenastavovanim IFS 2.)
# get content of pipe file MSG=$(cat $PIPEFILE) # test if contains message from udev TST=$(echo $MSG | grep "MYUSBKEY_INSERTED:/dev/$KEYPARTITION" | wc -l) if [ "$TST" != "0" ]; thenda sa to nahradit
if grep -q "MYUSBKEY_INSERTED:/dev/$KEYPARTITION" "$PIPEFILE"; then3.) namiesto kazdych 10 sekund sa pokusat citat subor, sa da nieco ako
tail -f "$PIPEFILE" | while true; do read msg dosomething "$msg" donevtedy sa uz ale neda grepovat priamo subor, ale musi sa cez to echo
if echo "$msg" | grep -q "MYUSBKEY_INSERTED:/dev/$KEYPARTITION"; then
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.