Как разрешить Steam загружать игры на корневой диск в Linux?

Вы всегда можете указать своей оболочке сообщать приложениям, какой код оболочки приводит к их выполнению. Например, с zsh, передавая эту информацию в переменной окружения $SHELL_CODEс использованием хука preexec()(printenv, используемого в качестве примера, вы должны использовать getenv("SHELL_CODE")в своей программе):

$ preexec() export SHELL_CODE=$1
$ printenv SHELL_CODE
printenv SHELL_CODE
$ printenv  SHELL_CODE
printenv  CODE
$ $(echo printenv SHELL_CODE)
$(echo printenv SHELL_CODE)
$ for i in SHELL_CODE; do printenv "$i"; done
for i in SHELL_CODE; do printenv "$i"; done
$ printenv SHELL_CODE; : other command
printenv SHELL_CODE; : other command
$ f() printenv SHELL_CODE
$ f
f

Все они будут выполнять printenvкак:

execve("/usr/bin/printenv", ["printenv", "SHELL_CODE"], 
       ["PATH=...",..., "SHELL_CODE=..."]);

Разрешение printenvизвлекать код zsh, который приводит к выполнению printenvс этими аргументами. Что вы хотите сделать с этой информацией, мне не ясно.

С bashфункция, наиболее близкая к zshpreexec(), будет использовать его $BASH_COMMANDв ловушке DEBUG, но обратите внимание, что bashвыполняет некоторый уровень перезаписи в этом (и, в частности, реорганизованы некоторые пробелы, используемые в качестве разделителя ), и это применяется к каждому (, ну, некоторые команды ), а не вся командная строка, введенная в приглашении (, см. также functraceопция ).

$ trap 'export SHELL_CODE="$BASH_COMMAND"' DEBUG
$ printenv SHELL_CODE
printenv SHELL_CODE
$ printenv $(echo 'SHELL_CODE')
printenv $(echo 'SHELL_CODE')
$ for i in SHELL_CODE; do printenv "$i"; done; : other command
printenv "$i"
$ printf '%s\n' "$(printenv "SHELL_CODE")"
printf '%s\n' "$(printenv "SHELL_CODE")"
$ set -o functrace
$ printf '%s\n' "$(printenv "SHELL_CODE")"
printenv "SHELL_CODE"
$ print${-+env  }    $(echo     'SHELL_CODE')
print${-+env  } $(echo     'SHELL_CODE')

Посмотрите, как некоторые из пробелов, которые являются разделителями в синтаксисе языка оболочки, были сжаты до 1 и как не всегда полная командная строка передается команде. Так что, вероятно, не полезно в вашем случае.

Обратите внимание, что я бы не советовал делать подобные вещи, так как вы потенциально передаете конфиденциальную информацию каждой команде, как в:

echo very_secret | wc -c | untrustedcmd

передаст этот секрет как wc, так и untrustedcmd.

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

.
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#define WRAP(x) (setenv("C_CODE", #x, 1), x)

int main(int argc, char *argv[])
{
  if (!fork()) WRAP(execlp("printenv", "printenv", "C_CODE", NULL));
  wait(NULL);
  if (!fork()) WRAP(0 + execlp("printenv",   "printenv", "C_CODE", NULL));
  wait(NULL);
  if (argc > 1 && !fork()) WRAP(execvp(argv[1], &argv[1]));
  wait(NULL);
  return 0;
}

Пример:

$./a.out printenv C_CODE
execlp("printenv", "printenv", "C_CODE", NULL)
0 + execlp("printenv", "printenv", "C_CODE", NULL)
execvp(argv[1], &argv[1])

Посмотрите, как некоторые пробелы были сжаты процессором C pre -, как в случае с bash. В большинстве, если не во всех языках, объем пространства, используемого в разделителях, не имеет значения, поэтому неудивительно, что компилятор/интерпретатор допускает здесь некоторую вольность с ними.

0
19.12.2020, 18:25
1 ответ

Сама файловая система, вероятно, доступна не только для чтения, хотя вы можете перепроверить, что она не смонтирована с помощью roв /proc/mounts. Что более вероятно, так это то, что, поскольку /usrпринадлежит root и обычно имеет разрешения 755/rwxr -xr -x, вам просто не разрешено писать непосредственно внутри этого каталога, чтобы создать новый каталог для вашего Steam. библиотека.

Чтобы позволить вам сделать это, вам нужно сначала создать подкаталог, который имеет доступ для записи для вашего пользователя (/opt, как правило, лучше для этих системных -независимых установок, но вы можете сделать это в / usr тоже если хочешь):

# as the user you run steam as
sudo mkdir /opt/steamlibrary
sudo chown "$(id -un)" /opt/steamlibrary

Теперь вы сможете создать свою библиотеку Steam под /opt/steamlibrary.

5
18.03.2021, 22:41

Теги

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