4

Я использую nohup для запуска Matlab и запуска сценария, который требует чтения и записи некоторых файлов.

nohup matlab -nojvm -nodisplay -r 'MyScript'&

Это происходит гладко, пока я вхожу в систему, но как только я выхожу и снова вхожу, я вижу, что мой процесс Matlab больше не работает. После проверки файла nohup.out я нахожу следующее сообщение об ошибке:

Unable to write file $HOME/matlab/my_mat_file.mat: permission denied

Похоже, что как только я выхожу из системы, владелец процесса matlab меняется, и он больше не имеет доступа к моим файлам. Как я могу предотвратить возникновение этой ошибки без изменения прав доступа к файлу, например, путем предоставления разрешений на запись для всех?

Это сообщение об ошибке появляется также во время использования экрана GNU. Если я ls -al $HOME внутри сеанса GNU-экрана перед выходом из системы, у меня будет

команда до выхода

Я отсоединяюсь от сеанса экрана GNU, выхожу из системы, регистрируюсь и снова присоединяюсь к сеансу экрана только для того, чтобы обнаружить, что я потерял доступ к файлам, к которым у меня был доступ к внутреннему экрану. Вывод ls -al $HOME теперь

команда после выхода

Интересно, не правда ли?

1 ответ1

2

Это как делать с аутентификацией.

Я начну с некоторых понятий о билетах и токенах и о том, как их использует система аутентификации Kerberos и AFS. К концу ответ на мой вопрос будет ясен, мне не разрешено писать в файл просто потому, что мой токен AFS был удален при выходе из системы. Тем не менее, решение моей проблемы заключалось в том, чтобы включить в сценарий matlab несколько строк, которые определяют, существует ли токен или нет, если он не создается. Как это было сделано, точно завершает ответ.

Аутентификация

Предоставление распределенной файловой системы, доступной в любом месте, подразумевает надежную систему безопасности. Вот почему AFS имеет строгую систему аутентификации, интегрированную с системой аутентификации Kerberos.

Аутентификация в AFS решается с помощью токена. Токены предоставляют пользователям доступ к данным в течение их жизненного цикла. Во многих случаях обработка токенов проходит гладко, не требуя вмешательства пользователя. Однако пользователь может в любой момент перечислить токены, выпущенные от его имени, с помощью tokens

username@machine00 ~ $ tokens

Tokens held by the Cache Manager:

User's (AFS ID xxxxx) tokens for afs@your.system.domain [Expires Mar 20 05:10]
   --End of list--

Токены AFS получены из идентификационного билета Kerberos. Аналогично токенам билеты Kerberos также идентифицируют пользователя. При использовании системы аутентификации Kerberos пользователю выдается KDC (Центр распространения ключей) начальный билет, называемый билетом на выдачу билетов. Этот первый билет однозначно идентифицирует пользователя и позволяет ему получить специальные билеты, необходимые для дополнительных услуг, таких как токены AFS. Фактически, вы можете напрямую использовать билет Kerberos для службы AFS, имеющей идентификационный токен AFS.

В большинстве случаев билет на выдачу билетов Kerberos автоматически получается при входе пользователя в систему. То же самое происходит с начальным токеном AFS. Как и токены, обработка билетов Kerberos в большинстве случаев невидима для пользователя, но вы можете перечислить выданные билеты, используя klist

username@machine00 ~ $ klist
Credentials cache: FILE:/tmp/krb5cc_V16088
        Principal: username@KERBEROS.REALM.DOMAIN

  Issued           Expires          Principal                 
Mar 19 19:10:11  Mar 20 05:10:11  krbtgt/KERBEROS.REALM.DOMAIN@KERBEROS.REALM.DOMAIN
Mar 19 19:10:11  Mar 20 05:10:11  afs/your.system.domain@KERBEROS.REALM.DOMAIN   
username@machine00 ~ $

Кэш учетных данных - это местоположение файла, в котором находятся билеты. Принципал - это идентификатор пользователя, который в основном является результатом комбинации имени пользователя и домена области Kerberos. Обратите внимание, что область Kerberos обычно указывается в верхнем регистре и чувствительна к регистру. Далее у нас есть список выпущенных билетов, с соответствующими датами выдачи и сроком действия. В этом случае первый билет (krtbg) соответствует билету на выдачу билетов в области KERBEROS.REALM.DOMAIN а второй - токену AFS в ячейке your.system.domain (имя которого обычно совпадает с именем домен, в котором это можно найти). Другие билеты Kerberos могут появиться в списке в случае, если они были запрошены.

Обновление токена

По истечении срока действия токена AFS доступ к учетной записи AFS становится невозможным. Признаки того, что такое событие имеет место, варьируются от ОС к ОС, однако в Unix/Linux вы обычно получаете сообщение об отказе в доступе при попытке доступа к вашим файлам:

username@machine00 ~ $ ls
ls: .: Permission denied

Когда токен истекает, вам нужно его обновить. Самый простой способ сделать это - выйти из системы и войти снова, поскольку в большинстве случаев обновление токена происходит автоматически при входе в систему. Но оказывается, что иногда выход из системы невозможен, особенно если вы запускаете что-то, что не хотите выходить, что имеет место.

Альтернативное решение для обновления билета используется kinit и aklog в последовательности. Первая из этих команд (kinit), для которой требуется ваш пароль, позволяет выполнить повторную проверку подлинности пользователя и возобновить выдачу билетов. Затем команда aklog позволяет получить токен AFS из билета Kerberos. Обратите внимание, что kinit пытается получить билет для основного субъекта и области по умолчанию. Если они не определены или если пользователь использует другое имя пользователя во время запроса билета, kinit следует использовать как kinit <principal>@<realm> , например:

username@machine00 ~ $ kinit username@KERBEROS.REALM.DOMAIN
username@KERBEROS.REALM.DOMAIN's Password: 
username@machine00 ~ $

Противоположностью aklog является unlog , который удаляет токен AFS. Соответственно, kdestroy удаляет файл заявок , удаляя все билеты Kerberos.

Как это спасло день и помогло мне полюбить своих друзей и семью

Как было сказано в начале, знание об этих концепциях помогло мне лучше понять, что происходит с моим сеансом Matlab. После выхода из системы моего токена AFS больше не было, и у моих запущенных процессов больше не было разрешения на запись в мой том afs. Поскольку на данный момент меня интересует только то, чтобы мой скрипт Matlab продолжал чтение и запись файлов даже после выхода из системы, я осторожно включил тест на токен AFS перед любым доступом к тому AFS.

ticket_status = unix('klist -s');
if ticket_status ~= 0,
   unix 'kinit username@KERBEROS.REALM.DOMAIN <<< "password"';
   unix  aklog
end

Как я уже сказал, это относится к сценарию matlab, и я разместил его перед любыми командами save или load . Код использует команду matlab unix для запуска своих аргументов в оболочке Unix и возврата результатов. Команда Unix klist -s запускает klist но возвращает статус завершения . Мы проверяем состояние выхода для учетных данных и запрашиваем новые в случае, если они не существуют или истек срок их действия.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .