Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: Проверить скриптом доступ на запись в удаленный каталог sshfs (test -w dir врет)  (Прочитано 1265 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн 027

  • Автор темы
  • Участник
  • *
  • Сообщений: 122
  • Cinnamon
    • Просмотр профиля
Тестирую на локалхосте.
Локальный каталог /var/www/example.local смонтирован в /mnt/test:
$ mount | grep '/mnt/test'
user@127.0.0.1:/var/www/example.local on /mnt/test type fuse.sshfs (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000)

В этом каталоге есть вложенный /var/www/example.local/dirname с правами 555, т.е. ридонли для всех.
Он же, будучи примонтированным по ssh, виден, как /mnt/test/dirname.
Пытаюсь проверить его на rw доступ в скрипте.
Стандартная проверка на возможность записи внезапно говорит «да»:
$ [ -w /mnt/test/dirname ] && echo W || echo '!W'
W
что, разумеется, не так, писать в него невозможно.
/usr/bin/test врет точно так же.

Проверка по локальному пути не врет:
$ [ -w /var/www/example.local/dirname ] && echo W || echo '!W'
!W

ls и stat определяют права по смонтированному пути правильно, но как из них извлечь четкий признак доступности на запись в скрипте?

Закостылил через touch с последующим удалением пробного файла, а нет ли более культурного способа? Может, опции монтирования какие-то хитрые, чтобы test проверял правильно.
« Последнее редактирование: 04 Февраля 2019, 23:40:53 от 027 »
Если бы было достаточно man bash, не было бы ABS.

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
stat определяют права по смонтированному пути правильно, но как из них извлечь четкий признак доступности на запись в скрипте?
Доступно на запись 7|6|3|2, недоступно - 5|4|1.
Попробуйте еще find
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн bezbo

  • Старожил
  • *
  • Сообщений: 1742
    • Просмотр профиля
$ [ -w /mnt/test/dirname ] && echo W || echo '!W'
?

/mnt/test/dirname .... /mnt/test/static_html/dirname

Оффлайн 027

  • Автор темы
  • Участник
  • *
  • Сообщений: 122
  • Cinnamon
    • Просмотр профиля
?
Недовычистил лишние подробности (в реальности длинные пути). Ошибок в путях нет, в консоли прописывал через автодополнение.
Если бы было достаточно man bash, не было бы ABS.

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
1:L~$
1:L~$ [ -w /usr/ ]; echo $?
1
1:L~$ [ -w /tmp/ ]; echo $?
0
1:L~$
Wars ~.o

Оффлайн 027

  • Автор темы
  • Участник
  • *
  • Сообщений: 122
  • Cinnamon
    • Просмотр профиля
victor00000, Читайте внимательнее, проблема не с локальными каталогами, а с примонтированными через sshfs.fuse.

Azure, stat у меня возвращает ноль даже для локального каталога:
$ stat /root/ ; echo $?
  Файл: /root/
  Размер: 172        Блоков: 0          Блок В/В: 4096   каталог
Устройство: 19h/25d Inode: 269         Ссылки: 1
Доступ: (0700/drwx------)  Uid: (    0/    root)   Gid: (    0/    root)
Доступ: 2019-01-07 04:25:41.447547952 +0400
Модифицирован: 2018-08-04 18:54:34.273371482 +0300
Изменён: 2018-08-04 18:54:34.273371482 +0300
 Создан: -
0

test возвращает 1:
$ [ -w /root/ ] ; echo $?
1
Если бы было достаточно man bash, не было бы ABS.

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
victor00000, Читайте внимательнее, проблема не с локальными каталогами, а с примонтированными через sshfs.fuse.

Azure, stat у меня возвращает ноль даже для локального каталога:
$ stat /root/ ; echo $?
  Файл: /root/
  Размер: 172        Блоков: 0          Блок В/В: 4096   каталог
Устройство: 19h/25d Inode: 269         Ссылки: 1
Доступ: (0700/drwx------)  Uid: (    0/    root)   Gid: (    0/    root)
Доступ: 2019-01-07 04:25:41.447547952 +0400
Модифицирован: 2018-08-04 18:54:34.273371482 +0300
Изменён: 2018-08-04 18:54:34.273371482 +0300
 Создан: -
0

test возвращает 1:
$ [ -w /root/ ] ; echo $?
1
не слушаю и не вниманию.
.
Wars ~.o

Оффлайн 027

  • Автор темы
  • Участник
  • *
  • Сообщений: 122
  • Cinnamon
    • Просмотр профиля
Доступно на запись 7|6|3|2, недоступно - 5|4|1.
Или вы это про октальную запись прав? Но этого же мало. Владельца и группу надо учесть.
Если бы было достаточно man bash, не было бы ABS.

Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 6690
  • 20% Cooler
    • Просмотр профиля
027, для начала, проверьте совет victor00000
🖥 AsRock B550M Pro4 :: AMD Ryzen 5 3600 :: 16 GB DDR4 :: AMD Radeon RX 6600 :: XFCE
💻 ACER 5750G :: Intel Core i5-2450M :: 6 GB DDR3 :: GeForce GT 630M :: XFCE

Оффлайн 027

  • Автор темы
  • Участник
  • *
  • Сообщений: 122
  • Cinnamon
    • Просмотр профиля
Какой совет? Где там у него совет? Про echo $? что ли? Или вот это вот: «не слушаю и не вниманию»?
« Последнее редактирование: 05 Февраля 2019, 04:44:02 от 027 »
Если бы было достаточно man bash, не было бы ABS.

Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 6690
  • 20% Cooler
    • Просмотр профиля
да, действительно баг какой-то с sshfs

$: mkdir mnt
$: sshfs alien@samsung:/ mnt
$: [ -w mnt/root ] && echo W || echo '!W'
W
$: touch mnt/root/1
touch: невозможно выполнить touch для 'mnt/root/1': Отказано в доступе
$: [ -w /root ] && echo W || echo '!W'
!W
« Последнее редактирование: 05 Февраля 2019, 09:56:51 от ALiEN175 »
🖥 AsRock B550M Pro4 :: AMD Ryzen 5 3600 :: 16 GB DDR4 :: AMD Radeon RX 6600 :: XFCE
💻 ACER 5750G :: Intel Core i5-2450M :: 6 GB DDR3 :: GeForce GT 630M :: XFCE

Оффлайн 027

  • Автор темы
  • Участник
  • *
  • Сообщений: 122
  • Cinnamon
    • Просмотр профиля
И с smb-шарой та же песня.

test чует только если шару с опцией ro смонтировать, а ограничение на стороне сервера — фигу-с.
$ mount | grep cifs
//172.23.30.2/site-docs$ on /mnt/sshfs/test type cifs (ro,nosuid,nodev,... многабукаф)
Шара смонтирована от имени виндопользователя, у которого на нее ридонли. Но только если дополнительно указать o=ro, тогда test правильно показывает:
$ [ -w /mnt/sshfs/test/UMO ]; echo $?
1
А без этой опции ноль рисует.

Зато stat лажает по полной:
$ stat /mnt/sshfs/test/UMO
  Файл: /mnt/sshfs/test/UMO
  Размер: 4096      Блоков: 8          Блок В/В: 16384  каталог
Устройство: 4dh/77d Inode: 844424930201418  Ссылки: 2
Доступ: (0777/drwxrwxrwx)  Uid: ( 1000/ onotole)   Gid: ( 1000/ onotole)
Доступ: 2018-03-16 09:15:09.033322400 +0300
Модифицирован: 2018-03-16 09:15:09.033322400 +0300
Изменён: 2018-03-16 09:15:09.033322400 +0300
 Создан: -

Ну и ну.
« Последнее редактирование: 05 Февраля 2019, 10:42:23 от 027 »
Если бы было достаточно man bash, не было бы ABS.

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
ALiEN175,
/root зачем?
1:L~$ ls mnt
1:L~$ echo 1 | sshfs a@a:/home/a mnt/ -o password_stdin
1:L~$ mkdir mnt/tmp
1:L~$ touch mnt/tmp/1
1:L~$ ls mnt/tmp/1mnt/tmp/1
1:L~$ fusermount -u mnt
1:L~$ ls mnt/tmp/1
ls: cannot access mnt/tmp/1: No such file or directory
1:L~$
Wars ~.o

Оффлайн AnrDaemon

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 28358
    • Просмотр профиля
Это не баг, это особенность работы всех проверялок такого типа. Они пытаются угадать результат, вручную проверяя права доступа и прочие вещи.
Как легко догадаться, подобное гадание даже локально не всегда верно, а уж на удалённых FS вообще бессмысленно.
Единственный способ проверить, доступен ли файл для чтения - попытаться из него что-то прочесть.
Единственный способ проверить, доступен ли файл для записи - записать в него что-то и посмотреть на результаты.
Но даже эти проверки не дадут 100% точного ответа, если файл в этот момент заблокирован другим процессом.

P.S.
А следовать "советам" форумных клоунов…
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

Оффлайн 027

  • Автор темы
  • Участник
  • *
  • Сообщений: 122
  • Cinnamon
    • Просмотр профиля
ОК, принимаем к сведению, что такая проверка недостоверна на сетевых файловых системах, надо пробовать непосредственно запись в тестируемый файл/каталог. Бирку «костыль» снимаем. :)
Если бы было достаточно man bash, не было бы ABS.

 

Страница сгенерирована за 0.051 секунд. Запросов: 25.