Ошибка при создании символических ссылок

Это довольно сложно рассмотреть. Для начала:

  • Стандарт POSIX, также известный как Единая спецификация Unix, гарантирует, что совместимая система будет иметь программу, вызываемую как sh, которая реализует определенный язык оболочки. В любой данной реальной системе shфактически будет одной из реальных оболочек, таких как оболочка Z, оболочка Almquist, оболочка Korn, оболочка Bourne Again и так далее; обычно распознает, что он был вызван по имени shи работает в режиме POSIX .
  • Более десяти лет назад сообщества Debian и Ubuntu усердно работали над устранением зависимостей различных частей операционной системы от расширений, предоставляемых оболочкой Bourne Again даже в ее режиме POSIX. Сценарии, которые указывали #!/bin/shв качестве своего интерпретатора, должны были не полагаться на так -, называемые башизмами , и, наоборот, сценарии, которые действительно полагались на башизмы, должны были явно указывать оболочку Bourne Again в качестве своего интерпретатора, а не sh.
  • Еще в 2011 году люди из systemd поставили перед собой цель отказаться от использования сценариев оболочки как части управления системой и службами.

Удалять скорлупу довольно просто. Один удаляет такие пакеты, как ash, bash, posh, mksh, pdksh, tcsh, dashи т. д.; с помощью инструмента управления пакетами, такого как aptitude. Сложность заключается в том, что два из них помечены как «необходимые» — dashи bash— а это означает, что другие пакеты могут предполагать их присутствие без явного объявления зависимости от них, и удалить -нетривиально. их, так как менеджер пакетов намеренно потребует от вас дополнительных действий, чтобы подтвердить, что вы действительно хотите их удалить.

Беда приходит с последствиями этого.

  • Благодаря работе разработчиков Debian и Ubuntu,теперь есть скрипты, которые явно объявляют #!/bin/bashинтерпретаторами скриптов. Такие скрипты не будут работать, если удалить оболочку Bourne Again, даже если останется оболочка Debian Almquist.
  • Сценарии, основанные на POSIX-совместимой оболочке, перестанут работать, если удалить оболочку Debian Almquist.
  • Скомпилированные программы, использующие оболочку, совместимую с POSIX, перестанут работать, если удалить оболочку Debian Almquist. Такие программы делают такие вещи, как вызов библиотечной функции system()или явно execvpe()утилиты sh.

В результате:

  • Приложения могут не работать. Да, они написаны на скомпилированном языке и не являются сценариями оболочки. Это не мешает разработчикам приложений быстро разветвлять и выполнять странные процессы оболочки тут и там.
  • Системные программы могут не работать. По той же причине.
  • Системные программы могут не работать по той причине, что они на самом деле являются сценариями оболочки.
    • Устранение сценариев оболочки из процессов запуска и завершения работы далеко не полное. Многие сервисы по-прежнему контролируются сценариями ван Смуренбурга rc, которые не смогут shинтерпретировать их. Запустите
      systemctl list-units
      Все службы, которые вы видите с «LSB :» или «SYSV :» в начале их описания, нуждаются в интерпретаторе оболочки для работы. Точно так же такие программы, как rabbitmq-serverили mysqld_safe, которые иногда (ab )используются в качестве служб, на самом деле являются сценариями оболочки.
    • Многие вспомогательные и служебные программы представляют собой сценарии оболочки. Debian /lib/systemd/systemd-sysv-install— это только один пример. Другие включают /usr/sbin/service, /usr/sbin/invoke-rc.dи даже /bin/fgrep.
  • Аварийный и аварийный режимы начальной загрузки не работают. И rescue.service, иemergency.service(в версии systemd в Ubuntu 16 )используют /bin/sh.

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

0
10.09.2020, 12:55
1 ответ

Гипотеза:/var/www/html/modul-cscart.com/public_html/app/addons/sendsmsявляется символической ссылкой с несуществующей целью.

cdговорит No such file or directory, потому что цель не существует. Тем не менее, символическая ссылка существует, поэтому lnговорит File exists. Я предполагаю, что ваш FTP-сервер настроен на игнорирование недействительных или всех символических ссылок.

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

ls -ld /var/www/html/modul-cscart.com/public_html/app/addons/sendsms

Если символическая ссылка существует, просто удалите ее перед тем, как ln -s …создать ее заново (с правильной целью, на этот раз ); или используйте ln -s -f …, чтобы перезаписать lnбез жалоб.

Предупреждение :Удаление или перезапись чего-либо, кроме символической ссылки, может привести к потере данных. Удаление или перезапись символической ссылки отбрасывает информацию о ее цели. Убедитесь, что вы знаете, что это за файл на самом деле. Помимо приведенной выше команды ls -ld …, используйте file(, если доступно ):

.
file /var/www/html/modul-cscart.com/public_html/app/addons/sendsms

Этот инструмент должен явно сообщить вам, что ссылка не работает, если это так.


Моя попытка воспроизвести проблему:

$ mkdir /tmp/test608752
$ cd /tmp/test608752
$ ls
$ ln -s foo bar
$ ln -s /tmp bar
ln: failed to create symbolic link 'bar': File exists
$ cd bar
-bash: cd: bar: No such file or directory
$ ls -ld bar
lrwxrwxrwx 1 kamil kamil 3 Sep 10 12:04 bar -> foo
$
0
18.03.2021, 23:06

Теги

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