Получение использования диска для каждого пользователя

718
kg98

Когда я печатаю, sudo du -sh ~student1я получаю ожидаемый результат (см. Скриншот). Однако, когда я пытаюсь использовать скрипт ниже:

#!/bin/bash  for user in "$@"; do sudo du -sh ~$user done 

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

(Я знаю, что могу сделать sudo du -sh student1 student2..., и что сценарий bash бесполезен, но я все еще не понимаю, почему он не работает.)

Я посмотрел на общее использование диска для конкретного пользователя, но это было не совсем то, что я искал.

5

1 ответ на вопрос

4
AFH

Оболочка выполняет один раз для расширения параметров, поэтому $userрасширяется, но предыдущий ~не расширяется. Для повторной обработки строки ввода используйте eval:

... eval sudo du -sh ~$user ... 
Правда. Это потому, что расширение тильды выполняется до раскрытия переменных в `bash`, тогда ни` sudo`, ни `du` не расширяют тильду. Kamil Maciorowski 6 лет назад 1
Обратите внимание, что `~` раскрывается в пользовательской оболочке, поэтому, если разрешения запрещают расширение определенного пользователя здесь, то использование `sudo` не отменяет это. AFH 6 лет назад 0
Зачем использовать `eval`, если вы можете использовать` / home / $ user` напрямую? Другой способ - не использовать sudo внутри скрипта, а вызывать скрипт с помощью sudo, который, на мой взгляд, намного чище ... xenoid 6 лет назад 0
@xenoid - опцией по умолчанию для домашнего каталога пользователя действительно является `/ home / $ user`, но его можно переопределить во время создания учетной записи или изменить позже. Это также не значение по умолчанию для `root`, по крайней мере, в Ubuntu и (предположительно) других дистрибутивах, производных от Debian. Если вы используете `sudo` вне скрипта, вы будете работать в среде, отличной от вызывающей оболочки, что имеет другие последствия: например, скрипт может не входить в` $ PATH`, который использует `sudo`. AFH 6 лет назад 1
Все лучше, чем использование `eval`. Это скрипт, проблемы с путями можно решить. И если вы хотите привередничать, в Ubuntu есть множество пользовательских идентификаторов без true / home (ни одного, ни странного, такого как `/ usr / sbin`. Но так как скрипт в любом случае предназначен для проверки обычных пользователей ... xenoid 6 лет назад 0
Я не делал никаких предположений относительно пользовательских определений, и вы не должны. Так называемым «обычным» пользователям по-прежнему не нужно использовать каталог `adduser` по умолчанию: существует множество причин, по которым системный администратор может не захотеть использовать это, и спрашивающий абсолютно правильно использует расширение` ~ `. В любом случае, откуда вы знаете, что спрашивающий не хочет включать `root` в свой отчет? Что не так с `eval`? Почему что-то лучше этого? Он был предназначен именно для такого рода использования. AFH 6 лет назад 0
`thescript" innocuous_user; echo eval опасен "` (я позволю вашему воображению заменить команду `echo` на что-либо, что может быть очень неприятным, если выполняется с привилегиями root). xenoid 6 лет назад 0
@xenoid - Неверно: точка с запятой в параметре будет разделять команду `sudo`, а остальная часть команды будет выполняться с правами пользователя. Я согласен с тем, что могут быть места, где у 'eval' могут быть непредвиденные последствия, но это не одно из них. В любом случае, пользователю, имеющему привилегии `sudo`, не нужно использовать что-то столь же неясное, как это, чтобы делать опасные вещи, а пользователи с запрещенным` sudo` не смогут запустить скрипт в любом случае. AFH 6 лет назад 1
Потому что вы не пробовали `thescript" innocuous_user; sudo id "` ... xenoid 6 лет назад 0
Я не понимаю ваш комментарий (`sudo id`?). То, что я пробовал, было `thescript" innocuous_user; whoami "` AFH 6 лет назад 0
Если «extra» - это команда «sudo что-то», вы снова получаете привилегии root для запуска «что-то» (и пароль не запрашивается, поскольку вы все еще находитесь в льготном периоде для sudo без пароля). xenoid 6 лет назад 0
Я не вижу проблемы. Если разрешено использовать `sudo`, не имеет значения, выполняете ли вы его в одной строке скрипта или как отдельную команду впоследствии. Я ответил на каждый ваш комментарий, и вы не предложили работоспособную альтернативу. Этот разговор ни к чему не приведет, поэтому я не собираюсь его продолжать. Спасибо за ваши комментарии, но мы должны согласиться на другое. AFH 6 лет назад 1

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