ssh игнорирует переменные в файлах профилей

Существует одна оговорка об установке этого в среде, а именно: если вы используете изображение, которому требуется 64-битное изображение, вам нужно указать ami напрямую с помощью default-instance-id.

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

1
задан 22 March 2018 в 02:23

3 ответа

Bash читает .profile * при запуске в качестве интерактивной оболочки входа. Когда команда предоставляется для выполнения или при запуске скрипта, она не является интерактивной, если вы не дадите опцию -i и не входите в систему, если вы не предоставите параметр -l и т. Д. Ничто из этого обычно не возможно, если выполнение команд через SSH.

Bash делает чтение .bashrc при неинтерактивном запуске SSH. Тем не менее, по умолчанию .bashrc включает проверку для интерактивного использования:

# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

Таким образом, никакая переменная, установленная в .profile или .bashrc, не доступна, когда вы выполняете ssh foo some-command. Вы можете поместить переменные в .bashrc перед проверкой на интерактивное выполнение. Например:

$ head ~/.bashrc
echo foo
# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac
$ ssh localhost env
foo
LC_MEASUREMENT=en_GB.UTF-8
SSH_CONNECTION=127.0.0.1 46916 127.0.0.1 22
LC_PAPER=en_GB.UTF-8
LC_MONETARY=en_GB.UTF-8
LANG=en_GB.UTF-8
LC_NAME=en_GB.UTF-8
XDG_SESSION_ID=155
USER=muru
...

Выполнен echo foo. Если бы у меня был export foo=bar, то foo появился бы на выходе env.

* с соответствующими оговорками о наличии таких файлов, как .bash_profile и т. Д.

1
ответ дан 8 June 2018 в 15:22
  • 1
    Это правильный ответ, спасибо. Просто для других, кто столкнется с той же проблемой: в мой .bashrc и проверка для интерактивного выполнения выглядит так: [Ф1]. – Markus Heller 22 March 2018 в 21:52

Bash читает .profile * при запуске в качестве интерактивной оболочки входа. Когда команда предоставляется для выполнения или при запуске скрипта, она не является интерактивной, если вы не дадите опцию -i и не входите в систему, если вы не предоставите параметр -l и т. Д. Ничто из этого обычно не возможно, если выполнение команд через SSH.

Bash делает чтение .bashrc при неинтерактивном запуске SSH. Тем не менее, по умолчанию .bashrc включает проверку для интерактивного использования:

# ~/.bashrc: executed by bash(1) for non-login shells. # see /usr/share/doc/bash/examples/startup-files (in the package bash-doc) # for examples # If not running interactively, don't do anything case $- in *i*) ;; *) return;; esac

Таким образом, никакая переменная, установленная в .profile или .bashrc, не доступна, когда вы выполняете ssh foo some-command. Вы можете поместить переменные в .bashrc перед проверкой на интерактивное выполнение. Например:

$ head ~/.bashrc echo foo # ~/.bashrc: executed by bash(1) for non-login shells. # see /usr/share/doc/bash/examples/startup-files (in the package bash-doc) # for examples # If not running interactively, don't do anything case $- in *i*) ;; *) return;; esac $ ssh localhost env foo LC_MEASUREMENT=en_GB.UTF-8 SSH_CONNECTION=127.0.0.1 46916 127.0.0.1 22 LC_PAPER=en_GB.UTF-8 LC_MONETARY=en_GB.UTF-8 LANG=en_GB.UTF-8 LC_NAME=en_GB.UTF-8 XDG_SESSION_ID=155 USER=muru ...

Выполнен echo foo. Если бы у меня был export foo=bar, то foo появился бы на выходе env.

* с соответствующими оговорками о наличии таких файлов, как .bash_profile и т. Д.

1
ответ дан 17 July 2018 в 18:22

Bash читает .profile * при запуске в качестве интерактивной оболочки входа. Когда команда предоставляется для выполнения или при запуске скрипта, она не является интерактивной, если вы не дадите опцию -i и не входите в систему, если вы не предоставите параметр -l и т. Д. Ничто из этого обычно не возможно, если выполнение команд через SSH.

Bash делает чтение .bashrc при неинтерактивном запуске SSH. Тем не менее, по умолчанию .bashrc включает проверку для интерактивного использования:

# ~/.bashrc: executed by bash(1) for non-login shells. # see /usr/share/doc/bash/examples/startup-files (in the package bash-doc) # for examples # If not running interactively, don't do anything case $- in *i*) ;; *) return;; esac

Таким образом, никакая переменная, установленная в .profile или .bashrc, не доступна, когда вы выполняете ssh foo some-command. Вы можете поместить переменные в .bashrc перед проверкой на интерактивное выполнение. Например:

$ head ~/.bashrc echo foo # ~/.bashrc: executed by bash(1) for non-login shells. # see /usr/share/doc/bash/examples/startup-files (in the package bash-doc) # for examples # If not running interactively, don't do anything case $- in *i*) ;; *) return;; esac $ ssh localhost env foo LC_MEASUREMENT=en_GB.UTF-8 SSH_CONNECTION=127.0.0.1 46916 127.0.0.1 22 LC_PAPER=en_GB.UTF-8 LC_MONETARY=en_GB.UTF-8 LANG=en_GB.UTF-8 LC_NAME=en_GB.UTF-8 XDG_SESSION_ID=155 USER=muru ...

Выполнен echo foo. Если бы у меня был export foo=bar, то foo появился бы на выходе env.

* с соответствующими оговорками о наличии таких файлов, как .bash_profile и т. Д.

1
ответ дан 23 July 2018 в 19:10

Другие вопросы по тегам:

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