Bash - Разделение предыдущие параметры команд

Жесткие ссылки могут быть определены путем сравнения и inode числа и номера устройства (две различных смонтированных файловых системы могут каждый иметь файл с тем же inode числом, но у них будут различные номера устройств). Можно считать device/inode вручную с stat $file, или find может сделать это для Вас с -samefile. Можно сделать поиск жестких ссылок более эффективным путем поиска только в том же устройстве:

find $fsroot/. -mount -samefile $myfile

Гибкие ссылки более тверды, поскольку они могут быть расположены где угодно. Необходимо разыменовать их для идентификации inode/device. Можно сделать это вручную с stat -L или автоматически с find -L:

find -L / -samefile $myfile

Обратите внимание, что это также найдет жесткие ссылки. Я не думаю find имеет простой способ искать только гибкие ссылки, которые указывают на определенный inode.

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

2
23.05.2017, 15:40
6 ответов

С Вашим исходным синтаксисом:
$ cat /tmp/foo.txt | awk -F@ '{print $2}'
1.2.3.4

5
27.01.2020, 21:54

Если можно использовать другой синтаксис для команды ssh, это легче get's:

ssh -l foo 1.2.3.4 
echo !:3 

но это требует этого точного синтаксиса.

1
27.01.2020, 21:54
  • 1
    +1, Это - хорошая идея. Очень изящный. Я предпочел бы не переобучать меня для использования-l каждый раз трудный. –  spuder 22.07.2013, 21:38

Можно использовать !! получить доступ к предыдущей командной строке так

echo !! | sed 's/.*@\(.*\).*/\1/' | awk '{print $1}'

может работать на Вас, например.

echo ssh user@123.456.654.321 ls | ...
123.456.654.321

echo ssh -p 19111 user@123.456.654.321 | ...
123.456.654.321

Единственное предположение здесь - то, что ipaddress будут предшествовать и что существует пространство или конец строки после него.

0
27.01.2020, 21:54

Когда у Вас был вывод печати в файл, я буду использовать Perl:

cat /tmp/foo.txt | \
perl -ne ' print $& if $_ =~ /(\d+)\.(\d+)\.(\d+)\.(\d+)/'
0
27.01.2020, 21:54

Найти числовой IP-адрес от предыдущей команды ssh:

echo $(grep -oP '\d+\.\d+\.\d+\.\d+' <<< "!ssh")

Я ничего не вижу в руководстве, которое позволило бы Вам найти "аргумент, соответствующий шаблону" (http://www.gnu.org/software/bash/manual/bashref.html#History-Interaction)

Вполне уверенный Вы не можете поместить !- расширения истории стиля в функции, но существует fc команда:

# return the IP address of the most recent ssh command
sship () { command grep -oP '\d+\.\d+\.\d+\.\d+' < <(fc -l ssh); }

Это не вынудит Вас иметь IP-адрес как определенное (например, последнее) аргумент

ssh user@1.2.3.4 hostname
0
27.01.2020, 21:54

Нет никакой конструкции расширения истории для повреждения в @. Однако последний аргумент предыдущей команды также доступен как переменная $_.

ssh-keygen -R "${_##*@}"

Обратите внимание, что это только работает, если имя хоста было последним аргументом предыдущей команды: это не будет работать, если предыдущая команда была, например. ssh somehost ls. Можно делать попытку парсинга вывода fc -ln -1 извлечь первый аргумент неопции.


Ваша цель кажется мне довольно плохой идеей. Редко должно удалить ключ хоста SSH — в основном это должно только произойти, если машина была переустановлена. Если необходимо часто делать это, что-то неправильно с методологией, или возможно с настройкой сети (удостоверьтесь, что клиенты DHCP получают восстанавливаемые IP-адреса, если Вы никогда не собираетесь соединяться с ними от другой машины).

0
27.01.2020, 21:54
  • 1
    Спасибо за вход. Самостоятельно и другие создают и уничтожают десятки экземпляров OpenStack в неделю для тестирования. Вы видите дополнительные детали о том, почему я добираюсь, так многие конфликтующие ssh включают этот вопрос serverfault.com/questions/506864 / … –  spuder 23.07.2013, 07:01

Теги

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