Пытаюсь удаленно выполнить строку через ssh, но моя обратная косая черта продолжает дублироваться

В вопросе ОП упоминается mount --bind . Быстрая проверка показывает, что она не изменяет счетчик ссылок для смонтированного каталога. Жесткая ссылка всегда изменяет счетчик ссылок, что вы можете увидеть, используя ls -ld .

Обычно (в большинстве Unix-подобных систем) количество жестких ссылок на каталог будет равно количеству каталогов, связанных с этим именем, например,

  • ".." (родительский каталог)
  • "." (сам каталог)
  • подкаталоги

Если вы читаете (обычно) более информативную страницу info , вы можете обнаружить, как другие сделали:

Oh great, one spends hours tying to find what is wrong only to
discover,
$ info ln
On all existing implementations, you cannot make a hard link to a
directory, and hard links cannot cross filesystem boundaries.  (These
restrictions are not mandated by POSIX, however.)

Therefore, kindly say everywhere you say super-user only,
instead say "few systems, super-user only".

хотя в настоящее время имеет формулировку

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

Создание (и удаление) жестких ссылок на каталог - это ограниченная функция для защиты от потери файлов, если каталог не связан. Поскольку операции связывания / разъединения в интерфейсе операционной системы C симметричны , связывание с каталогами обычно выполняется только в вызовах mkdir / rmdir.

Имейте в виду, что большая часть GNU coreutils была написана (и задокументирована) 20-30 лет назад, когда еще использовались некоторые настоящие музейные экспонаты. Как отмечено в Что касается жесткой ссылки , изначально не было вызовов mkdir / rmdir; каталоги были созданы (как привилегированная операция) с использованием жестких ссылок. Все это исчезло, когда были добавлены системные вызовы для решения упомянутых проблем. Но документация по-прежнему ссылается на эти системы вне памяти их сопровождающих. Вариант, который подвергался сомнению, был в предшественнике fileutils (который в середине 1990-х годов был объединен с textutils и shellutils ], чтобы сформировать coreutils ). Несколько пунктов из журнала изменений могут помочь прояснить происхождение этой функции:

Mon Jul 23 16:57:44 1990  David J. MacKenzie  (djm at albert.ai.mit.edu)

        * cp.c (copy): Make +update operate silently, like +one-file-system.
        * ln.c: Add -F as synonym for -d, for SunOS compatibility.

Wed Feb 21 11:13:26 1990  David J. MacKenzie  (djm at albert.ai.mit.edu)

        * ln.c (error): New function.
        (main, do_link): Call error instead of fprintf and exit. 
        (main): Recognize new -d +directory option to allow superuser to
        make hard links to dirs, like the BSD ln -f option.
        (do_link): Don't allow hard links to dirs (they are hard to
        get rid of -- rmdir and unlink don't do it), unless -d was given.
        (usage): Mention -d +directory option.

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

OPTIONS
       -f     Force a hard link to a directory -- this option is  only   avail-
              able to the super-user.

       -s     Create a symbolic link or links.

SYSTEM V OPTIONS
       -f     Force  files to be linked without displaying permissions, asking
              questions or reporting errors.

       -F     Force a hard link to a directory -- this option is  only  avail-
              able to the super-user.

       -s     Create a symbolic link or links.

Как отмечено в документации, эта функция (и соответствующая опция отсутствуют в POSIX (см. Раздел Обоснование , где объясняется, почему). Скорее, эта функция была перенесена в новую команду (также предоставляемую GNU coreutils) под названием link .Описание самой команды расплывчато; вы должны прочитать описание вызова функции , чтобы использовать стандарт. Однако в стандарте не уточняются условия, в которых команда будет работать, кроме заявления об отказе от ответственности о требуемых привилегиях. Для этого вы должны перейти к системно-зависимым функциям, выходящим за рамки стандарта:

Связывание с каталогом ограничено суперпользователем в большинстве исторических реализаций, поскольку эта возможность может создавать циклы в файловой иерархии или иным образом повреждать файловую систему. Этот том POSIX.1-2008 продолжает эту философию, запрещая link () и unlink () делать это. Другие функции могли бы это сделать, если бы разработчик разработал такое расширение.

Есть системы, которые используют жесткие ссылки на каталоги сверх обычного количества (2 плюс подкаталоги).

OSX использует несколько жестких ссылок на каталоги для обычных файлов . Он не поддерживает это при использовании ln (см. страницу руководства ). Согласно How Time Machine Works its Magic , он делает это, чтобы предоставить версии, используемые для средства резервного копирования Time Machine.

Дополнительная литература:

1
16.04.2019, 18:21
1 ответ

Похоже, что SSH просто лжет о том, сколько обратных слэшей он на самом деле отправляет на сервер. Рассмотрим несколько тривиальных примеров :

.
ssh -v juha@goliath 'echo h\ello'
...
debug1: Sending command: echo h\\ello
hello
...


ssh -v juha@goliath 'echo h\\ello'
...
debug1: Sending command: echo h\\\\ello
h\ello
...


ssh -v juha@goliath 'echo h\\\ello'
...
debug1: Sending command: echo h\\\\\\ello
h\ello
...


ssh -v juha@goliath 'echo h\\\\ello'
...
debug1: Sending command: echo h\\\\\\\\ello
h\\ello
...

Похоже, что SSH правильно передает цитируемую команду в удаленную оболочку, поскольку последняя выводит именно то, что мы получили бы, если бы команды выполнялись локально.

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

ssh -v juha@goliath "echo 'h"'\\'"ello'"
...
debug1: Sending command: echo 'h\\\\ello'
h\\ello
...

Чтобы прояснить схему цитирования для последнего примера :Последний аргумент в команде SSH представляет собой объединение трех строк :"echo 'h", '\\'и "ello'". Локальная оболочка преобразует это в echo 'h\\ello'перед передачей в SSH.

Теперь по вашему приказу:

ssh -vvvv  heat-admin@host.com ''pidstat -t -p '`pidof ovs-vswitchd` 1 1 | grep -E pmd\|%CPU'

Перед pidstatстоят две одинарные кавычки. Это приводит к тому, что pidstat -t -pне заключено в кавычки, но это не должно навредить. Следовательно, и из вышесказанного вполне вероятно, что удаленная оболочка правильно получает последний аргумент grepкак pmd\|%CPU, превращая его в расширенное регулярное выражение pmd|%CPU, которое передается в grepпо желанию.

Таким образом, если это не работает должным образом, возможно, причина в другом, а не в количестве обратных косых черт.

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

ssh -v heat-admin@host.com 'pidstat -t -p `pidof ovs-vswitchd` 1 1 | grep -E '"'pmd|%CPU'"

Здесь последний аргумент представляет собой конкатенацию двух строк:'pidstat -t -p `pidof ovs-vswitchd` 1 1 | grep -E 'и "'pmd|%CPU'". Локальная оболочка преобразует это в pidstat -t -p `pidof ovs-vswitchd` 1 1 | grep -E 'pmd|%CPU'и передает в SSH.

0
28.01.2020, 00:14

Теги

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