Fabric: рджреВрд░рд╕реНрде рд╕рд░реНрд╡рд░ рдкрд░ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдФрд░ рдкрде рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ (рд╕реЛрд░реНрд╕рд┐рдВрдЧ .bashrc рдирд╣реАрдВ)

рдХреЛ рдирд┐рд░реНрдорд┐рдд 9 рдЕрдХреНрддреВре░ 2016  ┬╖  22рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: fabric/fabric

рдирдорд╕реНрддреЗ,

рдореИрдВ рдХреБрдЫ рдкрд░реНрдпрд╛рд╡рд░рдгреАрдп рдЪрд░ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рдкрде рдЪрд░ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлреИрдм рдХреЗ рд░рди рдХрдорд╛рдВрдб рдХреЛ рдЪрд▓рд╛рддреЗ рд╕рдордп .bashrc рдлрд╝рд╛рдЗрд▓ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдпрд╛рдиреА рд╕реНрд░реЛрдд /home/ubuntu/.bashrc) рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:

рд░рди ('рд╕реНрд░реЛрдд /рд╣реЛрдо/рдЙрдмрдВрдЯреВ/.bashrc && echo $PATH')

рдпрд╣ рдореБрдЭреЗ рдХреЗрд╡рд▓ рджрд┐рдЦрд╛рддрд╛ рд╣реИ:

[[email protected]] рдЖрдЙрдЯ: /usr/рд▓реЛрдХрд▓/sbin:/usr/рд▓реЛрдХрд▓/рдмрд┐рди:/usr/sbin:/usr/bin:/sbin: /рдмрд┐рди:/usr/рдЦреЗрд▓:/usr/рд╕реНрдерд╛рдиреАрдп/рдЦреЗрд▓

рдЬрдм рдореИрдВ рд░рд┐рдореЛрдЯ рд╕рд░реНрд╡рд░ рдореЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд▓реЙрдЧ рдЗрди рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╡рд╛рд▓реЗ рдкрдереЛрдВ рдХреА рдПрдХ рд▓рдВрдмреА рд╕реВрдЪреА рдХреЗ рдмрдЬрд╛рдпред

рдореИрдВ рдЕрдкрдиреЗ рджреВрд░рд╕реНрде рд╣реЛрдо рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ .bashrc рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлреИрдм рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реВрдВ?

рд╢реБрдХреНрд░рд┐рдпрд╛!

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдпрд╣ рдмрдХрд╡рд╛рд╕ рдмрд╛рдд рд╣реИ, рдлреИрдм рдмрд╛рдд рдирд╣реАрдВред

рдХреНрдпрд╛ рдмреИрд╢ рдлрд╝рд╛рдЗрд▓реЗрдВ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рд╕реНрд░реЛрдд рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддрд╛ рд╣реИ рдЬрдЯрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ http://blog.flowblok.id.au/2013-02/shell-startup-scripts.html рдФрд░ Debian / Ubuntu (рдФрд░ рд╕рдмрд╕реЗ distros) рд╣реИ рдХреБрдЫ рдореЗрдВ рдЕрдиреБрдХреВрд▓рди /etc/profile рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ ~/.bashrc ред

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╢реЗрд▓ рдлреИрдм рдЙрдкрдпреЛрдЧ /bin/bash -l -c , рдФрд░ -l рдЗрд╕реЗ "рд▓реЙрдЧрд┐рди" рд╢реЗрд▓ рдмрдирд╛рддрд╛ рд╣реИред рдбреЗрдмрд┐рдпрди/рдЙрдмрдВрдЯреВ рдЕрдиреБрдХреВрд▓рди рдХреЗ рдмрд┐рдирд╛, рдпрд╣ ~/.bash_profile рд╕реНрд░реЛрдд рдХреЗ рд▓рд┐рдП рдПрдХ рдмреИрд╢ "рд▓реЙрдЧрд┐рди" рд╢реЗрд▓ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди ~/.bashrc ред

рд▓реЗрдХрд┐рди ubuntu 16.04 рдкрд░, рдпрд╣ рд▓реЙрдЧрд┐рди-рд╢реЗрд▓ рдХреЗ рд▓рд┐рдП рднреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ .bashrc рдХрд╛ рд╕реНрд░реЛрдд рд▓рдЧрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдбрд┐рдлрд╝реЙрд▓реНрдЯ .bashrc рдХреЗ рдиреАрдЪреЗ рдЬреЛрдбрд╝реА рдЧрдИ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдЧрд░ рдпрд╣ рдЧреИрд░-рд╕рдВрд╡рд╛рджрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдЪрд▓рдиреЗ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИ рддреЛ рдпрд╣ рд╢реАрд░реНрд╖ рдХреЗ рдкрд╛рд╕ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддрд╛ рд╣реИред

рдпрд╣рд╛рдБ рдореИрдВрдиреЗ ubuntu-16.04 рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ .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

export VAR1=val1

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

export VAR2=val2

# don't put duplicate lines or lines starting with space in the history.
# See bash(1) for more options
HISTCONTROL=ignoreboth
...

рдпрд╣рд╛рдВ рдПрдХ рдлреИрдмрдлрд╛рдЗрд▓ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдореИрдВ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:

from fabric.api import run, env, task

<strong i="23">@task</strong>
def get_myvars():
    run("echo VAR1=$VAR1 VAR2=$VAR2")

рдкрд░рд┐рдгрд╛рдо:

$ fab -H testpy05.ec2.st-av.net get_myvars
[testpy05.ec2.st-av.net] Executing task 'get_myvars'
[testpy05.ec2.st-av.net] run: echo VAR1=$VAR1 VAR2=$VAR2
[testpy05.ec2.st-av.net] out: VAR1=val1 VAR2=
[testpy05.ec2.st-av.net] out: 
...

рд╕рднреА 22 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдпрд╣ рдмрдХрд╡рд╛рд╕ рдмрд╛рдд рд╣реИ, рдлреИрдм рдмрд╛рдд рдирд╣реАрдВред

рдХреНрдпрд╛ рдмреИрд╢ рдлрд╝рд╛рдЗрд▓реЗрдВ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рд╕реНрд░реЛрдд рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддрд╛ рд╣реИ рдЬрдЯрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ http://blog.flowblok.id.au/2013-02/shell-startup-scripts.html рдФрд░ Debian / Ubuntu (рдФрд░ рд╕рдмрд╕реЗ distros) рд╣реИ рдХреБрдЫ рдореЗрдВ рдЕрдиреБрдХреВрд▓рди /etc/profile рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ ~/.bashrc ред

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╢реЗрд▓ рдлреИрдм рдЙрдкрдпреЛрдЧ /bin/bash -l -c , рдФрд░ -l рдЗрд╕реЗ "рд▓реЙрдЧрд┐рди" рд╢реЗрд▓ рдмрдирд╛рддрд╛ рд╣реИред рдбреЗрдмрд┐рдпрди/рдЙрдмрдВрдЯреВ рдЕрдиреБрдХреВрд▓рди рдХреЗ рдмрд┐рдирд╛, рдпрд╣ ~/.bash_profile рд╕реНрд░реЛрдд рдХреЗ рд▓рд┐рдП рдПрдХ рдмреИрд╢ "рд▓реЙрдЧрд┐рди" рд╢реЗрд▓ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди ~/.bashrc ред

рд▓реЗрдХрд┐рди ubuntu 16.04 рдкрд░, рдпрд╣ рд▓реЙрдЧрд┐рди-рд╢реЗрд▓ рдХреЗ рд▓рд┐рдП рднреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ .bashrc рдХрд╛ рд╕реНрд░реЛрдд рд▓рдЧрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдбрд┐рдлрд╝реЙрд▓реНрдЯ .bashrc рдХреЗ рдиреАрдЪреЗ рдЬреЛрдбрд╝реА рдЧрдИ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдЧрд░ рдпрд╣ рдЧреИрд░-рд╕рдВрд╡рд╛рджрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдЪрд▓рдиреЗ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИ рддреЛ рдпрд╣ рд╢реАрд░реНрд╖ рдХреЗ рдкрд╛рд╕ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддрд╛ рд╣реИред

рдпрд╣рд╛рдБ рдореИрдВрдиреЗ ubuntu-16.04 рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ .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

export VAR1=val1

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

export VAR2=val2

# don't put duplicate lines or lines starting with space in the history.
# See bash(1) for more options
HISTCONTROL=ignoreboth
...

рдпрд╣рд╛рдВ рдПрдХ рдлреИрдмрдлрд╛рдЗрд▓ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдореИрдВ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:

from fabric.api import run, env, task

<strong i="23">@task</strong>
def get_myvars():
    run("echo VAR1=$VAR1 VAR2=$VAR2")

рдкрд░рд┐рдгрд╛рдо:

$ fab -H testpy05.ec2.st-av.net get_myvars
[testpy05.ec2.st-av.net] Executing task 'get_myvars'
[testpy05.ec2.st-av.net] run: echo VAR1=$VAR1 VAR2=$VAR2
[testpy05.ec2.st-av.net] out: VAR1=val1 VAR2=
[testpy05.ec2.st-av.net] out: 
...

рдПрдХ рдирдЬрд╝рд░ рдореЗрдВ рд╡реИрдз рд▓рдЧрддрд╛ рд╣реИ, рдзрдиреНрдпрд╡рд╛рдж @ploxiln!

рд╡рд┐рд╕реНрддреГрдд рдЙрддреНрддрд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рдпрд╣ рдорд╛рдирдХ ssh рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реЗ рднрд┐рдиреНрди рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдбреАрдмрдЧ рдХрд░рдирд╛ рдХрдард┐рди рдерд╛ред рдЬрдм рдореИрдВрдиреЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ ssh'd рд╕рднреА рдореЗрдВ рдареАрдХ рдХрд╛рдо рдХрд┐рдпрд╛, рдЬрд╣рд╛рдВ OSX рдореЗрдВ .bash_profile рдирд╣реАрдВ рдЪрд▓рдиреЗ рдХреЗ рдХрд╛рд░рдг рдХрдкрдбрд╝реЗ рдХрд╛ рдПрдХ рдЕрд▓рдЧ PATH рдорд╛рди рдерд╛ред

@bitpropet рдпрд╣ рдПрдХ OSX рдмрдЧ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ ??

@ рдХреЛрдб-рдкреЗрдбрд╝ рдХреНрдпрд╛ рдЖрдк рдлреИрдмреНрд░рд┐рдХ 1 рдпрд╛ 2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ? 1.x рд╕реНрдкрд╖реНрдЯ рд╢реЗрд▓ рд░реИрдкрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдпрд╣ рдорд╛рдирдХ рдУрдкрдирдПрд╕рдПрд╕рдПрдЪ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рдЕрд▓рдЧ рд╣реЛрдЧрд╛; рд╕рдВрд╕реНрдХрд░рдг 2 рдХреЛрдИ рд░реИрдкрд┐рдВрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреА рдУрд░ рд╕реЗ sshd рдЬреЛ рдЪрд▓ рд░рд╣рд╛ рд╣реИ рдЙрд╕рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ OpenSSH рдХреНрд▓рд╛рдЗрдВрдЯ рдХреА рддрд░рд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рдВрд╕реНрдХрд░рдг 1 рдореЗрдВ рдЙрд╕ рд╢реЗрд▓ рд░реИрдкрд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ env рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдорд╛рди рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЗрд╕рдореЗрдВ рдЭрдВрдбреЗ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ -i рдЬреЛ IIRC "рдЗрдВрдЯрд░реЗрдХреНрдЯрд┐рд╡ рдореЛрдб рдЪрд▓рд╛рдиреЗ рдФрд░ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕реНрд░реЛрдд рдХрд░рдиреЗ" рдХреЗ рд▓рд┐рдП рдмреИрд╢ рд╣реИред

рдпрд╣ рдЕрдЬреАрдм рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рд╕рдВрд╕реНрдХрд░рдг 2.2.1 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореБрдЭреЗ рдЕрдкрдирд╛ рдРрдк рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд░рдирд╛ рд╣реИ:
c.run('bash -l -c "python3 ./configure.py"')
рдЬреИрд╕реЗ рд╣реА рдореИрдВрдиреЗ рдкрд╛рдпрдерди 3 рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛, рдпрд╣ рдореЗрд░реЗ .bash_profile рдорд╛рдзреНрдпрдо рд╕реЗ PATH рдореЗрдВ рдЬреБрдбрд╝ рдЧрдпрд╛, рдЬреЛ рдХрд┐ рдлреИрдмреНрд░рд┐рдХ рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдореИрдВрдиреЗ рдорд╛рдирдХ рдмрд┐рд▓реНрдЯрд┐рди sshd config рдореЗрдВ рдХреЛрдИ рд╕рдВрд╢реЛрдзрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред

рдпрд╣ рдЕрдЬреАрдм рдмрд╛рдд рд╣реИ, рдореБрдЭреЗ рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдореИрдВ рджреЛрд╣рд░рд╛ рд╕рдХрддрд╛ рд╣реВрдВред рдпрд╣ рд╕рд╛рдмрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕ рдПрдХ рддреНрд╡рд░рд┐рдд рд╡рд┐рд╡реЗрдХ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдХрд┐ рдореЗрд░рд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ: рдлреИрдмреНрд░рд┐рдХ 2 рдХреБрдЫ рднреА 'рд╡рд┐рд╢реЗрд╖' рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ: sshd рд╕рдВрдЪрд╛рд▓рд┐рдд рдирд┐рд╖реНрдкрд╛рджрди:

@ рдХреЛрдб-рдЯреНрд░реА рднреА, рдпрджрд┐ рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рдХреБрдЫ рдФрд░ рд╡рд┐рд╡рд░рдг рдкреЛрд╕реНрдЯ рдХрд░реЗрдВ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдЪрд▓рд╛ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЕрдиреНрдп рдкрд░реНрдпрд╛рд╡рд░рдгреАрдп рд╡рд┐рд╡рд░рдг (рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рдУрдПрд╕/рд╕рдВрд╕реНрдХрд░рдг, рдЖрджрд┐)ред

рдЬрд╝рд░реВрд░, рдореИрдВ рд╕рд░реНрд╡рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдкреБрд░рд╛рдирд╛ OSX рд╕рдВрд╕реНрдХрд░рдг рдЪрд▓рд╛ рд░рд╣рд╛ рд╣реВрдБред рдпрджрд┐ рдЖрдк рдкреБрд╖реНрдЯрд┐ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рднреА рдирдП рдореИрдХреЛрдЬрд╝ рдкрд░ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рддреЛ рдУрд╣ рдареАрдХ рд╣реИред рд▓реЗрдХрд┐рди рдпрджрд┐ рдирд╣реАрдВ рддреЛ рд╢рд╛рдпрдж рдореИрдХреЛрдЬрд╝ рдХреЗ рд╕рд╛рде рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕рд░реНрд╡рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИ?

  • рдХреНрд▓рд╛рдЗрдВрдЯ: рдЙрдмрдВрдЯреВ 16.04, рдкрд╛рдпрдерди 3.6.6, рдУрдкрдирдПрд╕рдПрд╕рдПрдЪ 7.2p2, рдмреИрд╢ 4.3.48, рдлреИрдмреНрд░рд┐рдХ 2.2.1
  • рд╕рд░реНрд╡рд░: рдУрдПрд╕рдПрдХреНрд╕ 10.11, рдкрд╛рдпрдерди 3.6.6, рдУрдкрдирдПрд╕рдПрд╕рдПрдЪ 6.9p1, рдмреИрд╢ 3.2.57

рд╕рд╛рдЗрдб рдиреЛрдЯ, рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЧрд▓рдд рдирд┐рджрд╛рди рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ:

OSX рдореЗрдВ .bash_profile рдирд╣реАрдВ рдЪрд▓рдиреЗ рдХреЗ рдХрд╛рд░рдг рдХрдкрдбрд╝реЗ рдХрд╛ рдПрдХ рдЕрд▓рдЧ PATH рдорд╛рди рдерд╛

рдХреНрдпрд╛ рдпрд╣ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп #1744 рдХрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдлреИрдмреНрд░рд┐рдХ 2 ssh рд╕реЗ рдкрд╛рдЗрдк рдХреЗ рдиреАрдЪреЗ рд╕реНрдерд╛рдиреАрдп рдПрдирд╡реА рд╡рд░реНрд░реНрд╕ рдХреЛ рд╢рдВрдЯрд┐рдВрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрд▓рдЧ рд╣реИ? (рдкреНрд░рд╢реНрди рдореЗрдВ рд╕рдЯреАрдХ env vars рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреНрдпрд╛ рд╡реЗ рд╕реНрдерд╛рдиреАрдп рдФрд░ рджреВрд░рд╕реНрде рд░реВрдк рд╕реЗ рд╕рдорд╛рди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ; @ рдХреЛрдб-рдЯреНрд░реА рдкреНрд▓реЗ рд░реА рдореЗрдВ рд╕рдЯреАрдХ рдорд╛рдиреЛрдВ рдХреА рджреЛрдмрд╛рд░рд╛ рдЬрд╛рдВрдЪ рдХрд░рдХреЗ рдЗрд╕ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ: рдЙрдирдХреЗ рд╕реНрдерд╛рдиреАрдп рдФрд░ рджреВрд░рд╕реНрде bash_profile ... )


рд▓реЗрдХрд┐рди рдореИрдВ рд╡реИрд╕реЗ рднреА рдЗрд╕рдХрд╛ рд╕реАрдзрд╛ рдирд┐рд╡рд╛рд░рдг рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ, рдмрд╕ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдлрд┐рд░ рд╕реЗ рдкрд╛рдЧрд▓ рдирд╣реАрдВ рд╣реВрдВ: sshd рд╢реЗрд▓ рдФрд░ рд╕реЛрд░реНрд╕ рдХреА рдЧрдИ рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рдХреА рдореЗрд░реА рд╕рдордЭред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ #1816 рд╕реЗ рдкрд░рд┐рджреГрд╢реНрдп/рдЦреБрдлрд┐рдпрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рдЬреЛ рдХрд┐ рдЧреЛрд▓реЗ рдФрд░ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рд╣реИред рдпрд╣ ssh рдПрдХ рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдиреЗ рдФрд░ рдлреИрдмреНрд░рд┐рдХ рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░рдг рдпрд╣рд╛рдВ _probably_ рд╕реАрдзреЗ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдирд╣реАрдВ рд╣реИ (рдмрдирд╛рдо рдпрд╣ "рдмрд╕ рдХреИрд╕реЗ sshd рд╢реЗрд▓ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд░ рд░рд╣рд╛ рд╣реИ"), рд▓реЗрдХрд┐рди рд╡реИрд╕реЗ рднреА рд▓рд┐рдВрдХ рдХрд░рдиреЗ рд▓рд╛рдпрдХ рд╣реИред

рдкрд╛рдпрд╛ рдХрд┐ рдЧрд╣рд░реЗ sshd рдХреЛрдб рдбрд╛рдЗрд╡рд┐рдВрдЧ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдкрд░ рдареЛрдХрд░ рдЦрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдореБрдЭреЗ рдпрд╛рдж рд╣реИ рдХрд┐ рдкрд┐рдЫрд▓реЗ рдХреБрдЫ рдорд╣реАрдиреЛрдВ рдореЗрдВ, рдЗрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рдореИрдВ рдЗрд╕реЗ рдЕрднреА рдирд╣реАрдВ рдвреВрдВрдв рд╕рдХрддрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдкрд░реЗрд╢рд╛рди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЖрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╕реЗ рдкрд╣рд▓реЗ рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣ рдПрдХ рдЕрд╕рдВрдмрдВрдзрд┐рдд рдкреИрд░рд╛рдорд┐рдХреЛ рдореБрджреНрджрд╛ рдерд╛ (рд▓рд┐рдВрдХрд┐рдВрдЧ рдирд╣реАрдВ рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рдмрд╛рдд рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рдЪреАрдЬреЗрдВ рдирд╣реАрдВ)ред рдареАрдХ рд╣реИред

рдареАрдХ рд╣реИ, рддреЛ рдЬрдм рд╣рдо рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ?

  • SSH-рдж-рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдЪрд╛рд╣рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдпрд╛ рддреЛ shell рдЪреИрдирд▓ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВ (рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд▓реЙрдЧрд┐рди рд╢реЗрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреЛрдИ command рдирд╣реАрдВ рд▓реЗрддрд╛ рд╣реИ) рдпрд╛ рдПрдХ exec рдЪреИрдирд▓ рдЕрдиреБрд░реЛрдз (рдЬреЛ рд╕рд┐рд░реНрдл рдХрд╣рддрд╛ рд╣реИ "рджрд┐рдП рдЧрдП рдХрдорд╛рдВрдб рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдкрде рд╣реЛ рд╕рдХрддрд╛ рд╣реИ" рдФрд░ рдЕрдзрд┐рдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ)
  • Paramiko рдмрд╛рдж рд╡рд╛рд▓рд╛ рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдКрдкрд░ рдкрд╛рдпрд╛ред
  • рддреЛ рдУрдкрдирдПрд╕рдПрд╕рдПрдЪ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ? рдореИрдВ рдУрдкрдирд╢-рдкреЛрд░реНрдЯреЗрдмрд▓ рдХреЗ рдЕрдкрдиреЗ рд╕реНрдерд╛рдиреАрдп рдЪреЗрдХрдЖрдЙрдЯ рдХреЛ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдБ ( 775f8a23f2353f5869003c57a213d14b28e0736e )

рдареАрдХ рд╣реИ, рдкрд╣рд▓реЗ рдореИрдВ рдереЛрдбрд╝рд╛ рдирд╛рд╕рдордЭ рд╣реВрдБред рдПрдХ рдордирдорд╛рдиреА рдбреЗрдмрд┐рдпрди 8.10 рдХрдВрдЯреЗрдирд░ рдХреЗ рдЦрд┐рд▓рд╛рдл рдЪрд▓ рд░рд╣рд╛ рд╣реИ (рдЬреЛ рдУрдкрдирдПрд╕рдПрд╕рдПрдЪ 6.7 рдЪрд▓рд╛ рд░рд╣рд╛ рд╣реИ!) рдореИрдВ рдЗрд╕реЗ ssh localhost whoami рдХрд░рдиреЗ рдкрд░ DEBUG3-рд╕реНрддрд░ рд▓реЙрдЧ рдореЗрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ:

debug1: server_input_channel_req: channel 0 request exec reply 1
debug1: session_by_channel: session 0 channel 0
debug1: session_input_channel_req: session 0 req exec
Starting session: command for root from 172.17.0.1 port 42598

fab -H localhost -- whoami :

debug1: server_input_channel_req: channel 0 request exec reply 1
debug1: session_by_channel: session 0 channel 0
debug1: session_input_channel_req: session 0 req exec
Starting session: command for root from 172.17.0.1 port 42610

рдареАрдХ рд╣реИ, рд╡реЗ рджреЛрдиреЛрдВ exec ... рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреЗрдбрд╝ рдореЗрдВ рдХреБрдЫ рдЕрд▓рдЧ? рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░...рд╡рд╣рд╛рдБ рдирд╣реАрдВ рд╣реИред рджреЛрдиреЛрдВ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреЗ рд╣реИрдВ:

sshd,1 -D -e
  тФФтФАsshd,1535
      тФФтФАpstree,1537 -alpU

рддреЛ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЦреЗрд▓ рдореЗрдВ рдХреЛрдИ рдЦреЛрд▓ рдирд╣реАрдВ рд╣реИ? рдпрд╣ рднреА рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ? рдХреНрдпрд╛ рдореИрдВ && рдЬреИрд╕реА рд╢реЗрд▓реА рдЪреАрдЬреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?

рдореИрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ! рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП whoami && id рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рддреЛ рдпреВрдирд┐рдХреНрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд┐рдпрдВрддреНрд░рдг рдХреА рдореЗрд░реА рд╕рдордЭ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рдпрд╣ рдереЛрдбрд╝рд╛ рдЕрдЬреАрдм рд╣реИ; рдРрд╕рд╛ рд▓рдЧрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ sshd рд╕рдЪрдореБрдЪ exec(string) , рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдпрд╣ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЦреЛрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛, рддреЛ рдХреНрдпрд╛ рд╣рдо рдЗрд╕реЗ pstree рдореЗрдВ рдирд╣реАрдВ рджреЗрдЦреЗрдВрдЧреЗ?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдУрдкрдирд╢-рдкреЛрд░реНрдЯреЗрдмрд▓ рдореЗрдВ рдЦреБрджрд╛рдИ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реИред


  • рд╕рд╛рд░рд╛ рдЬрд╛рджреВ session.c . рдореЗрдВ рд╣реЛрдиреЗ рд▓рдЧрддрд╛ рд╣реИ
  • рдкрд╣рд▓рд╛ рджрд┐рд▓рдЪрд╕реНрдк рдкрдбрд╝рд╛рд╡ рд╡рд╣ рд╣реИ рдЬрд╣рд╛рдВ session_input_channel_req рд▓реЙрдЧ рд▓рд╛рдЗрди рд╣реЛрддреА рд╣реИ, (рдЖрдкрдиреЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рд╣реИ) session_input_channel_req , рдЬреЛ рд▓реЙрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рд╕рддреНрд░ рдкреНрд░рдХрд╛рд░ (рдЦреЛрд▓, рдкреАрдЯреА рдУрдкрди, рдирд┐рд╖реНрдкрд╛рджрди, рд╕рдмрд╕рд┐рд╕реНрдЯрдо, рдЖрджрд┐) рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рднреЗрдЬрддрд╛ рд╣реИред
  • рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ exec рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ session_exec_req
  • рдЬреЛ рд╣рдореЗрдВ do_exec . рдкрд░
  • рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ рдмрд╕ рдлрд┐рд░ рд╕реЗ рд▓реЙрдЧ рдЗрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдВрддрддрдГ рд╣рдореЗрдВ рдпрд╛ рддреЛ do_exec_pty рдпрд╛ (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдордиреЗ рдПрдХ рдкреАрдЯреАрдЖрдИ рдХрд╛ рдЕрдиреБрд░реЛрдз рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рдЖрдк рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд▓реЙрдЧ рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рдЯреНрдЯреА рдирдВрдмрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ) do_exec_no_pty
  • рдХреМрди рд╕рд╛ рдХрд╛рдВрдЯрд╛ рдФрд░ рдлрд┐рд░ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ do_child
  • рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЦреЛрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ
  • рдФрд░ рдЖрд░рд╕реА рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдЪреАрдЬреЗрдВ рдХрд░рддрд╛ рд╣реИ ...
  • рдЕрдВрдд рдореЗрдВ, рд╣рд╛рдБ, рдпрд╣ рдЙрд╕ рд╢реЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЙрд╕рдиреЗ рд╢реЗрд▓, -c, рдФрд░ рдХрдорд╛рдВрдб рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд┐рдпрд╛ рдерд╛

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ _did_ рдЗрд╕ рдЕрдиреБрд░реЗрдЦрдг рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ (рд▓реЗрдХрд┐рди рдПрдХ рдЕрд▓рдЧ рдХрд╛рд░рдг/рдлреЛрдХрд╕ рдХреЗ рд▓рд┐рдП) рдЕрддреАрдд рдореЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ рджрд┐рд╕рдВрдмрд░ 2016 рдореЗрдВ рдерд╛: https://github.com/paramiko/paramiko/pull/398#issuecomment -264281759ред рдмрд┐рд▓рдХреБрд▓ рднреВрд▓ рдЧрдпрд╛ рдерд╛...


рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВ рдореЗрдВ рдЦреЛрд▓ рдирд╣реАрдВ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣реА рд╣реИ pstree рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рд╡рдЬрд╣ рд╕реЗ рд╣реИ execve рд╣реИ, рдЬреЛ рдПрдХ рдмрдЪреНрдЪреЗ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдорд╛рддрд╛ рдкрд┐рддрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдПрдХ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╣реИред рдЬрд╛рдирдХрд░ рдЕрдЪреНрдЫрд╛ рд▓рдЧрд╛ред (рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЧрд▓рдд, рдЬреЛ рд╕рд┐рд░реНрдл sshd рдЪрд╛рдЗрд▓реНрдб рдкреНрд░реЛ рдХреЛ рд╢реЗрд▓ рдХреЗ рд╕рд╛рде рдмрджрд▓ рджреЗрддрд╛ рд╣реИ; рд╢реЗрд▓ рд╕реНрд╡рдпрдВ рднреА рдПрдХ рд░рд┐рдкреНрд▓реЗрд╕-рдореА рд╕реНрдЯрд╛рдЗрд▓ рдПрдХреНрдЬрд╝реАрдХреНрдпреВрдЯрд┐рд╡ рдХреЙрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИ; рдиреАрдЪреЗ рдЯрд┐рдкреНрдкрдгреА рджреЗрдЦреЗрдВред)


рд╡реИрд╕реЗ рднреА! рдЗрд╕рдХрд╛ рдЕрднреА рднреА рдорддрд▓рдм рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдлреИрдмреНрд░рд┐рдХ рдФрд░ рдУрдкрдирдПрд╕рдПрд╕рдПрдЪ рдХреЗ рдХреНрд▓рд╛рдЗрдВрдЯ рд╢реЗрд▓ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рд╣реА рд╕рдЯреАрдХ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ; рдЙрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдУрдкрдирдПрд╕рдПрд╕рдПрдЪ рдХреЗ рдХреЛрдбрдмреЗрд╕ рдХреЗ рдЗрди рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрд╣ рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рдХреБрдЫ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП bash -c "python3 ./configure.py" , рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде bash @ рдХреЛрдб-рд╡реГрдХреНрд╖ рдХреА MacOS рд╕реНрддрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдФрд░ рдЙрдирдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЦреЛрд▓ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ред

рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдПрдирд╡реА рд╡рд░ рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░рд╛ рдЭреБрдХрд╛рд╡ рд╕рдЯреАрдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХрдорд╛рддреНрд░ рджреВрд╕рд░реА рдЪреАрдЬ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рдлрд┐рд░ рд╕реЗ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реВрдВ: рджреЛ рдирд┐рд╖реНрдкрд╛рджрди рд╡рд╛рддрд╛рд╡рд░рдг рдХреИрд╕реЗ рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдореЗрд░реЗ CLI-рдХреЗрдВрджреНрд░рд┐рдд рдкрд░реАрдХреНрд╖рдг рдореЗрдВ FWIW, env рджреЛрдиреЛрдВ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдкрд░ рд╕рдорд╛рди рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЙрди рдЕрдиреНрдп env рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛, _default_ рд╡реНрдпрд╡рд╣рд╛рд░ (SSH рд╕реБрд░рдХреНрд╖рд╛ рдиреАрддрд┐ рдХреЗ рдХрд╛рд░рдг) рд╣рдореЗрд╢рд╛ рдРрд╕рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреЛрдИ рд╕реНрдерд╛рдиреАрдп env "рд▓реАрдХ" рди рд╣реЛ рджреВрд╕рд░реА рдУрд░ред

рд╣рд╛рдБ, рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ sshd рд╣рдореЗрд╢рд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╢реЗрд▓ рдореЗрдВ рдХрдорд╛рдВрдб рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЪрд▓рд╛рддрд╛ рд╣реИ (/etc/passwd рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛)ред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдпрд╣ рдХрдорд╛рдВрдб рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ "exec" рдХреЗ рд╕рд╛рде рдкреНрд░реАрдкреЗрдиреНрдб рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ рдпрд╣ рдХрдорд╛рдВрдб рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╕рд┐рдВрдЧрд▓ рдХрдорд╛рдВрдб рд╣реИред

$ ssh testdeploy02.ec2.st-av.net pstree -a
...
  |-sshd -D
  |   `-sshd 
  |       `-sshd  
  |           `-pstree -a
$ ssh testdeploy02.ec2.st-av.net 'pstree -a && sleep 1'
...
  |-sshd -D
  |   `-sshd 
  |       `-sshd  
  |           `-bash -c pstree -a && sleep 1
  |               `-pstree -a
$ ssh testdeploy02.ec2.st-av.net 'VAR=-a sh -c "exec pstree \$VAR"'
...
  |-sshd -D
  |   `-sshd 
  |       `-sshd  
  |           `-pstree -a

рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХреЗ рд▓рд┐рдП, рдпреЗ рдЬреНрдпрд╛рджрд╛рддрд░ ssh рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ sshd рд╕рд░реНрд╡рд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ:

$ grep Env /etc/ssh/*_config
/etc/ssh/ssh_config:    SendEnv LANG LC_*
/etc/ssh/sshd_config:AcceptEnv LANG LC_*

рддреЛ ssh рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХреБрдЫ рдЪрд░ (рдХрдорд╛рдВрдб-рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдмрд╛рд╣рд░) рднреЗрдЬрддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ sshd рджреНрд╡рд╛рд░рд╛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХреБрдЫ рдЕрдкрд╡рд╛рдж рд╣реИрдВ:

$ ssh testdeploy02.ec2.st-av.net env | grep TERM
$ ssh -t testdeploy02.ec2.st-av.net env | grep TERM
TERM=xterm-256color

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ "рд╕рд┐рдВрдЧрд▓ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рд╢реЗрд▓ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдирд┐рд╖реНрдкрд╛рджрди" рд╡реНрдпрд╡рд╣рд╛рд░ рдмреИрд╢ рдХреА рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ:

$ dash -c "pstree -a"
...
  тФЬтФАsshd -D
  тФВ   тФФтФАsshd 
  тФВ       тФФтФАsshd  
  тФВ           тФФтФАbash
  тФВ               тФФтФАdash -c pstree -a
  тФВ                   тФФтФАpstree -a
$ bash -c "pstree -a"
  тФЬтФАsshd -D
  тФВ   тФФтФАsshd 
  тФВ       тФФтФАsshd  
  тФВ           тФФтФАbash
  тФВ               тФФтФАpstree -a

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдкреВрд░реНрдгрддрд╛ рдХреЗ рд▓рд┐рдП:

$ bash -c "pstree -a && sleep 1"
  тФЬтФАsshd -D
  тФВ   тФФтФАsshd 
  тФВ       тФФтФАsshd  
  тФВ           тФФтФАbash
  тФВ               тФФтФАbash -c pstree -a && sleep 1
  тФВ                   тФФтФАpstree -a

рдЖрд╣ рд╣рд╛рдБ, рдореБрдЭрд╕реЗ рдЧрд▓рддреА рд╣реБрдИ рдереА, execve рдорддрд▓рдм рд╣реИ рдХрд┐ sshd рдЪрд╛рдЗрд▓реНрдб proc рд╡рд╣реА рд╣реИ рдЬреЛ рдмрджрд▓ рджреА рдЬрд╛рддреА рд╣реИ, рддреЛ рдЙрд╕рдХреЗ рдмрд╛рдж рдЬреЛ рд╣реЛрддрд╛ рд╣реИ рд╡рд╣ рд╢реЗрд▓ рдкрд░ рд╣реА рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрд╣ -c xxx рд▓рд┐рдП рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред рдореЗрд░реЗ рдкрд░реАрдХреНрд╖рдг zsh, fwiw рдореЗрдВ рдереЗред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ @ploxiln рд╣рд╛рдБ env vars рд╡рд╛рд▓реА рдмрд╛рдд рдКрдкрд░ рд╕реЗ рдЬреБрдбрд╝реЗ рдЕрдиреНрдп рдЯрд┐рдХрдЯреЛрдВ рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗ рд░рд╣реА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛рдирд╛ рдмрд╛рдХреА рд╣реИ рдХрд┐ @ рдХреЛрдб-рдкреЗрдбрд╝ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд▓рдХреНрд╖рдг рдХрд╛ рдЕрдиреБрднрд╡ рдХрд░ рд░рд╣рд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЭреВрдард╛ рдЕрд▓рд╛рд░реНрдо рд╣реИред рдореБрдЭреЗ рдкрддрд╛ рдирд╣реАрдВ рдерд╛ рдХрд┐ рдПрд╕рдПрд╕рдПрдЪ рдЗрдирд▓рд╛рдЗрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдФрд░ рдПрд╕рдПрд╕рдПрдЪ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реЙрдЧ рдЗрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рдЕрдВрддрд░ рдерд╛ред рдЬрдм рдореИрдВ ssh host 'echo $PATH' рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдЙрд╕рдиреЗ PATH рдХреЛ рднреА рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рд▓реЙрдЧ рдЗрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж echo $PATH рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдореБрдЭреЗ рдЕрднреА рднреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рдкрддрд╛ рд╣реИ рдХрд┐ ssh рдРрд╕рд╛ рдХреНрдпреЛрдВ рдХрд░рддрд╛ рд╣реИ (рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ ssh host 'bash -l -c "python3 ./configure.py"' )ред рднрд▓реЗ рд╣реА, рдпрд╣ рдХрд╣рдирд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ рдХрд┐ рдпрд╣ рдлреИрдмреНрд░рд┐рдХ рдХрд╛ рдореБрджреНрджрд╛ рдирд╣реАрдВ рд╣реИред рдЧрд▓рддрдлрд╣рдореА рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИред

@ рдХреЛрдб-рдкреЗрдбрд╝ рдЬреЛ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЙрд╕рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ - рдЧреЛрд▓реЗ рдореЗрдВ рдХреБрдЫ рдЕрд▓рдЧ рдореЛрдб рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдЕрдХреНрд╕рд░ 'рд▓реЙрдЧрд┐рди' рдФрд░ 'рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡' рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ (рдФрд░ рдЖрдорддреМрд░ рдкрд░ рд╡реЗ рдмреЗрд╕ рдореЛрдб рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рди рддреЛ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ) рдФрд░ рдХреМрди рд╕рд╛ рдореЛрдб рдЦреЛрд▓ рдореЗрдВ рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдпрд╣ рдмрджрд▓рддрд╛ рд╣реИ рдХрд┐ рдЖрд░рд╕реА-рдлрд╛рдЗрд▓реЛрдВ рдХрд╛ рдХреМрди рд╕рд╛ рд╕реЗрдЯ рд▓реЛрдб рд╣реЛрддрд╛ рд╣реИред

рдпрд╣рд╛рдВ рдореБрдЦреНрдп рдмрд┐рдВрджреБ рдпрд╣ рд╣реИ рдХрд┐ bash -c xxx рдХреЛ "рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡" рдирд╣реАрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреБрдЫ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдирд╛ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ - рдЬреИрд╕реЗ .bash_profile - рд▓реЗрдХрд┐рди bash рдмрд┐рдирд╛ -c рдЖрдорддреМрд░ рдкрд░ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдКрдкрд░ рджреЗрдЦрд╛ - sshd рд╣рдореЗрд╢рд╛ bash -c <command send down the pipe> рдЪрд▓рддрд╛ рд╣реИ рдЬрдм рдЖрдк рдЗрд╕реЗ рдПрдХ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВ (рдЬреИрд╕рд╛ рдХрд┐ рдлреИрдмреНрд░рд┐рдХ рдХрд░рддрд╛ рд╣реИ, рдпрд╛ ssh host command рдХрд░рддрд╛ рд╣реИ), рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдореЗрд╢рд╛ рдЧреИрд░-рд╕рдВрд╡рд╛рджрд╛рддреНрдордХ рдореЛрдб рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред (рдЬрдм рддрдХ рдЖрдк рдХреНрдпрд╛ рдХрдкрдбрд╝рд╛ 1 рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рд╛рде рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ, рдиреЗрд╕реНрдЯ, рдЦреЛрд▓ рдЪрд▓рд╛рдиреЗ -l ... рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЖрдк рдЪрд▓рд╛ рд░рд╣реЗ рд╣реИрдВ bash -c "bash -l -c \"oh god escaping is hard help\"" рдФрд░ рдореИрдВ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ ЁЯеГ рдЕрдм рдЬрд╛ рд░рд╣рд╛ рд╣реВрдБред

рд╡реИрд╕реЗ рднреА, рд╕рдм рдХреБрдЫ рдЦреЛ рдирд╣реАрдВ рдЧрдпрд╛ рд╣реИ, рдореБрдЭреЗ рд╣рд░ рдХреБрдЫ рд╡рд░реНрд╖реЛрдВ рдореЗрдВ рдЪреАрдЬреЛрдВ рдХреЗ рдЗрд╕ рд╣рд┐рд╕реНрд╕реЗ рдХреА рдЕрдкрдиреА рдпрд╛рджрджрд╛рд╢реНрдд рдХреЛ рддрд╛рдЬрд╝рд╛ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ, рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░ рдЙрд╣ ... рдЕрдм рдореИрдВ рддрд░реЛрддрд╛рдЬрд╛ рд╣реВрдБ

рдпрд╣ рдмрдХрд╡рд╛рд╕ рдмрд╛рдд рд╣реИ, рдлреИрдм рдмрд╛рдд рдирд╣реАрдВред

рдХреНрдпрд╛ рдмреИрд╢ рдлрд╝рд╛рдЗрд▓реЗрдВ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рд╕реНрд░реЛрдд рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддрд╛ рд╣реИ рдЬрдЯрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ http://blog.flowblok.id.au/2013-02/shell-startup-scripts.html рдФрд░ Debian / Ubuntu (рдФрд░ рд╕рдмрд╕реЗ distros) рд╣реИ рдХреБрдЫ рдореЗрдВ рдЕрдиреБрдХреВрд▓рди /etc/profile рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ ~/.bashrc ред

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╢реЗрд▓ рдлреИрдм рдЙрдкрдпреЛрдЧ /bin/bash -l -c , рдФрд░ -l рдЗрд╕реЗ "рд▓реЙрдЧрд┐рди" рд╢реЗрд▓ рдмрдирд╛рддрд╛ рд╣реИред рдбреЗрдмрд┐рдпрди/рдЙрдмрдВрдЯреВ рдЕрдиреБрдХреВрд▓рди рдХреЗ рдмрд┐рдирд╛, рдпрд╣ ~/.bash_profile рд╕реНрд░реЛрдд рдХреЗ рд▓рд┐рдП рдПрдХ рдмреИрд╢ "рд▓реЙрдЧрд┐рди" рд╢реЗрд▓ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди ~/.bashrc ред

рд▓реЗрдХрд┐рди ubuntu 16.04 рдкрд░, рдпрд╣ рд▓реЙрдЧрд┐рди-рд╢реЗрд▓ рдХреЗ рд▓рд┐рдП рднреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ .bashrc рдХрд╛ рд╕реНрд░реЛрдд рд▓рдЧрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдбрд┐рдлрд╝реЙрд▓реНрдЯ .bashrc рдХреЗ рдиреАрдЪреЗ рдЬреЛрдбрд╝реА рдЧрдИ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдЧрд░ рдпрд╣ рдЧреИрд░-рд╕рдВрд╡рд╛рджрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдЪрд▓рдиреЗ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИ рддреЛ рдпрд╣ рд╢реАрд░реНрд╖ рдХреЗ рдкрд╛рд╕ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддрд╛ рд╣реИред

рдпрд╣рд╛рдБ рдореИрдВрдиреЗ ubuntu-16.04 рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ .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

export VAR1=val1

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

export VAR2=val2

# don't put duplicate lines or lines starting with space in the history.
# See bash(1) for more options
HISTCONTROL=ignoreboth
...

рдпрд╣рд╛рдВ рдПрдХ рдлреИрдмрдлрд╛рдЗрд▓ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдореИрдВ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:

from fabric.api import run, env, task

<strong i="24">@task</strong>
def get_myvars():
    run("echo VAR1=$VAR1 VAR2=$VAR2")

рдкрд░рд┐рдгрд╛рдо:

$ fab -H testpy05.ec2.st-av.net get_myvars
[testpy05.ec2.st-av.net] Executing task 'get_myvars'
[testpy05.ec2.st-av.net] run: echo VAR1=$VAR1 VAR2=$VAR2
[testpy05.ec2.st-av.net] out: VAR1=val1 VAR2=
[testpy05.ec2.st-av.net] out: 
...

рдЖрдк рдореЗрд░реА рдЬрд╛рди рдмрдЪрд╛рдИред рдпрд╣ рд╕рд╣реА рдЙрддреНрддрд░ рд╣реИ рдЬреЛ рдореБрдЭреЗ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ :) рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж!

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

omzev picture omzev  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

SamuelMarks picture SamuelMarks  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

haydenflinner picture haydenflinner  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

TimotheeJeannin picture TimotheeJeannin  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jamesob picture jamesob  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ