2015-10-16 2 views
1

Мой вопрос представляет собой комбинацию из this question и this question. Я хочу, чтобы установить файл с пробелами в пути с правами SUDO, как таковые:Java exec mount с sudo и файловыми пробелами

sudo mount /path/to/mount/point /dir\\ with/spaces\\ in\\ name 

Если нет никаких пробелов в пути, я могу сделать это, так как этот пользователь имеет разрешение SUDO для команды монтирования:

Runtime.exec("sudo mount /path/to/mount/point /dir/without/spaces"); 

Но есть пробелы, так что я пробовал:

Runtime.exec("sudo mount /path/to/mount/point /dir\\ with/spaces\\ in\\ name"); 

Это дало мне "Непризнанные ARG '\'" или что-то, что эффект от монтировки. Окружение дорожек с одиночными или двойными кавычками также не помогло.

Тогда я попробовал:

Runtime.exec("sudo", "mount", "/path/to/mount/point", "/dir with/spaces in name"); 

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

Это похоже на уловку-22 для меня. Я могу получить sudo, если я пойду с единственным методом String, или я могу получить имена путей, если я иду с методом String array. Как я могу получить как?

ответ

1

Одиночная обратная косая черта не может быть написана дословно в строковом литерале. Обратные косые должны быть экранированы, поэтому используйте \\:

Runtime.exec("sudo mount /path/to/mount/point /dir\\ with/spaces\\ in\\ name"); 

Как для пароля, sudo не могут запрашивать пароль, если в последнее время вы ввели его на ту же оболочку. Если вы хотите разрешить монтирование заданного пути без прав суперпользователя (для обычного пользователя), отредактируйте его запись /etc/fstab, как показано here.

Добавить user его варианты, например:

/dev/sda8 /media/foo ext4 rw,user,exec 0 0 

, а затем добавить привилегии для чтения и записи:

# chmod a+rw /media/foo 

Тогда ваша линия может быть:

Runtime.exec("mount /path/to/mount/point /dir\\ with/spaces\\ in\\ name"); 

или

Runtime.exec("/bin/mount", "/path/to/mount/point", "/dir with/spaces in name"); 

или похожий.

+0

Спасибо за ответ. И жаль, что я спешил вчера и забыл сбежать от моей косой черты: это была не проблема, с которой я сталкивался. Я пробовал каждую комбинацию одиночных, двойных и даже тройных обратных косых черт («\\», «\\\\» и «\\\\\\» в Java), но, к сожалению, ни одна из них не работает. Судо также должен оставаться там, потому что учетная запись, с которой я запускаю это, имеет разрешение sudo для монтирования, но не регулярное разрешение, и у меня нет контроля над этим. Я знаю, это очень специфический набор ограничений. –

+0

Вы хотите 'sudo' без предоставления пароля пользователя? – user2622016

+0

В основном мне нужно решение, которое позволяет путям с пробелами и не требует от меня пароля. У меня уже есть команда монтирования, настроенная с помощью NOPASSWD в/etc/sudoers для этой учетной записи. –

Смежные вопросы