μλ νμΈμ,
fabμ run λͺ λ Ήμ μ€ννμ¬ μΌλΆ νκ²½ λ³μλ₯Ό μΆκ°νκ³ κ²½λ‘ λ³μλ₯Ό νμ₯ν λ .bashrc νμΌμ λ‘λνλ €κ³ ν©λλ€(μ: μμ€ /home/ubuntu/.bashrc).
run('μμ€/ν/μ°λΆν¬/.bashrc && μμ½ $PATH')
μ΄κ²μ λμκ²λ§ 보μ¬μ€λλ€:
[[email protected]] μΆλ ₯: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin: /bin:/usr/games:/usr/local/games
μ격 μλ²μ μλμΌλ‘ λ‘κ·ΈμΈν λ νμλλ ν¨μ¬ λ κΈ΄ κ²½λ‘ λͺ©λ‘ λμ .
μ격 ν λλ ν 리μμ .bashrc νμΌμ μ¬λ°λ₯΄κ² κ°μ Έμ€κΈ° μν΄ fabμ μ»μΌλ €λ©΄ μ΄λ»κ² ν΄μΌ ν©λκΉ?
κ°μ¬ν©λλ€!
μ΄κ²μ λλ°μ΄ μλλΌ λ©μ§ μΌμ λλ€.
무μ bashλ νμΌνκΈ° μμν λ μμ€ κ²°μ μ λ³΅μ‘ ν μ http://blog.flowblok.id.au/2013-02/shell-startup-scripts.html νκ³ μλ λ°λΉμ / μ°λΆν¬ (λλΆλΆμ λ°°ν¬ν)κ° μΌλΆ μ¬μ©μ μ μ /etc/profile
λ° κΈ°λ³Έ ~/.bashrc
.
fabμμ μ¬μ©νλ κΈ°λ³Έ μμ /bin/bash -l -c
μ΄κ³ -l
λ "λ‘κ·ΈμΈ" μλ‘ λ§λλλ€. debian/ubuntu μ¬μ©μ μ§μ μ΄ μμΌλ©΄ bash "login" μ
Έμμ ~/.bash_profile
λ₯Ό μμ±ν μ μμ§λ§ ~/.bashrc
λ μμ±ν μ μμ΅λλ€.
κ·Έλ¬λ μ°λΆν¬ 16.04μμλ login-shellμ κ²½μ°μλ κΈ°λ³Έμ μΌλ‘ .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
...
λ€μμ ν μ€νΈ μ€μΈ fabfileμ λλ€.
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'νμ λ OSXμμ .bash_profileμ μ€ννμ§ μκΈ° λλ¬Έμ ν¨λΈλ¦μ΄ λ€λ₯Έ PATH κ°μ κ°μ‘μ λ λͺ¨λ μ λλ‘ μλνμ΅λλ€.
@bitprophet μ΄κ²μ OSX λ²κ·Έ μΌ μ μμ΅λλ€ ??
@code-tree ν¨λΈλ¦ 1 λλ 2λ₯Ό μ¬μ©νκ³ μμ΅λκΉ? 1.xλ λͺ μμ μ Έ λνΌλ₯Ό μ¬μ©νλ―λ‘ νμ€ OpenSSH ν΄λΌμ΄μΈνΈμ λ€λ¦ λλ€. λ²μ 2λ λνμ μννμ§ μμΌλ©° sshdκ° μ¬μ©μλ₯Ό λμ νμ¬ μ€νλλ μΈ‘λ©΄μμ OpenSSH ν΄λΌμ΄μΈνΈμ ν¨μ¬ λ μ μ¬νκ² μλν΄μΌ ν©λλ€.
λ²μ 1μλ ν΄λΉ μ λνΌλ₯Ό λ³κ²½νκΈ° μν λͺ κ°μ§ env κ΅¬μ± κ° μ΅μ
μ΄ μμΌλ―λ‘ -i
μ κ°μ νλκ·Έλ₯Ό μΆκ°νλ €κ³ ν μ μμ΅λλ€.
2.2.1
λ²μ μ μ¬μ©νκ³ μκΈ° λλ¬Έμ μ΄μν©λλ€. νμ¬ λ΄ μ±μ΄ μλνλλ‘ νλ €λ©΄ λ€μμ μνν΄μΌ ν©λλ€.
c.run('bash -l -c "python3 ./configure.py"')
Python 3μ μ€μΉν λ Fabricμμ μ€νλμ§ μλ .bash_profile
λ₯Ό ν΅ν΄ PATHμ μΆκ°λμμ΅λλ€. νμ€ λ΄μ₯ sshd ꡬμ±λ μμ νμ§ μμμ΅λλ€.
μ΄μν©λλ€. 볡μ ν μ μλμ§ νμΈν΄μΌ ν©λλ€. λ΄κ° μλ―Ένλ λ°λ₯Ό μ¦λͺ νκΈ° μν΄ λΉ λ₯Έ μ¨μ ν μΆμ μ μννμ΅λλ€. Fabric 2λ 'νΉλ³ν' μμ μ μννμ§ μμ΅λλ€. re: sshd κΈ°λ° μ€ν:
command
command
λν μΆκ° μμ μμ΄ Channel.exec_commandλ₯Ό νΈμΆν©λλ€.ssh myserver <command>
μ μμ ν λμΌν΄μΌ ν©λλ€.@code-tree λν κ°λ₯νλ©΄ μ€ν μ€μΈ νλͺ©κ³Ό κΈ°ν νκ²½ μΈλΆ μ 보(ν΄λΌμ΄μΈνΈ λ° μλ² OS/λ²μ λ±)μ λν μμΈν μ 보λ₯Ό κ²μνμμμ€.
λ¬Όλ‘ , μ΄μ OSX λ²μ μ μλ²λ‘ μ€ννκ³ μμ΅λλ€. μ΅μ MacOSμμ λͺ¨λ κ²μ΄ μ λλ‘ μλνλμ§ νμΈν μ μλ€λ©΄ μ€ μ λ©λλ€. κ·Έλ¬λ κ·Έλ μ§ μμ κ²½μ° μΌλ°μ μΌλ‘ MacOSλ₯Ό μλ²λ‘ μ¬μ©νλ λ° λ¬Έμ κ° μμ΅λκΉ?
μ°Έκ³ λ‘ μ΄κ²μ΄ μ€μ λ‘ μ€μ§μ κ²½μ°μΈμ§ κΆκΈν©λλ€.
OSXμμ .bash_profileμ μ€ννμ§ μκΈ° λλ¬Έμ ν¨λΈλ¦μ λ€λ₯Έ PATH κ°μ΄ μμ΅λλ€.
λμ Fabric 2κ° λ‘컬 νκ²½ λ³μλ₯Ό νμ΄νλ‘ λΆλ₯νλ€λ μΈ‘λ©΄μμ ssh
μ λ€λ₯Έ #1744μ μκ° λ μ μμ΅λκΉ? (λ¬Έμ μ μ νν env λ³μμ λ‘컬 λ° μ격 μ μ¬ μ¬λΆμ λ°λΌ λ€λ¦
λλ€. @code-treeλ λ‘컬 λ° μ격 bash_profileμ μ νν κ°μ λ€μ νμΈνμ¬ μ΄ μ΄λ‘ μ μ½κ² λ°μ¦ν μ μμ΅λλ€... π)
κ·Έλ¬λ λλ μ΄ λ¬Έμ λ₯Ό μ§μ μ μΌλ‘ ν΄κ²°ν κ²μ λλ€. λ΄κ° λ―ΈμΉ κ²μ΄ μλλΌλ κ²μ μκΈ° μν΄μμ λλ€. sshdκ° μκ³Ό μμ€ νμΌμ κ΄μ μμ 무μμ νκ³ μλμ§μ λν μ΄ν΄μ λλ€.
λν μ΄κ²μ΄ μ λ° μμ νμΌμ κ΄ν #1816μ μλ리μ€/μ§λ₯κ³Ό κ΄λ ¨μ΄ μλμ§ κΆκΈν©λλ€. ssh
ν λ°©ν₯μΌλ‘ λμνκ³ Fabricμ΄ λ€λ₯Έ λ°©μμΌλ‘ λμνλ€λ μ£Όμ₯ λλ¬Έμ _μλ§λ_ μ§μ μ μΌλ‘ κ΄λ ¨μ΄ μμ§λ§("sshdκ° μμ μ μμ μΌλ‘ νΈμΆνλ λ°©λ²"κ³Ό λ€λ¦) μ΄μ¨λ μ°κ²°ν κ°μΉκ° μμ΅λλ€.
μ§λ λͺ κ°μ λμ νλ κ²μΌλ‘ κΈ°μ΅νλ κΉμ sshd μ½λ λ€μ΄λΉμ μ°μ°ν λ°κ²¬νμ΅λλ€. μ§μ¦λλ μΌμ΄μ§λ§ μ§κΈμ μ°Ύμ μ μμ΅λλ€. νΈμ§: μ μΈμ¦ μ μ λͺ λ Ήμ μ€ννλ κ²κ³Ό κ΄λ ¨μ΄ μλ Paramiko λ¬Έμ (νΌλμ€λ¬μ΄ μ μ΄ μκΈ° λλ¬Έμ μ°κ²°λμ§ μμ)λΌκ³ μκ°ν©λλ€. μ’μμ.
μ’μ΅λλ€. κ·Έλ λ€λ©΄ μ°λ¦¬κ° exec λͺ λ Ήμ μμ²ν λ μ€μ λ‘ λ¬΄μ¨ μΌμ΄ μΌμ΄λκ³ μμ΅λκΉ?
shell
μ±λ μμ²(μ¬μ©μκ° μ μν λ‘κ·ΈμΈ μ
Έ νλ‘κ·Έλ¨μ λ‘λνκ³ command
νμ§ μμ) λλ exec
μ±λμ μμ²ν©λλ€. μμ²("κ²½λ‘λ₯Ό ν¬ν¨ν μ μλ μ£Όμ΄μ§ λͺ
λ Ή λ¬Έμμ΄μ μ€νν¨"μ΄λΌκ³ λ§νκ³ λ μ΄μ μ§μ νμ§ μμ)775f8a23f2353f5869003c57a213d14b28e0736e
)μ λ‘컬 체ν¬μμμ μ΄ν΄λ³΄κ² μ΅λλ€.κΈμ, λ¨Όμ λ΄κ° μ’ λΉλΉ λκ². λ΄κ°νκ³ μ DEBUG3 μμ€μ λ‘κ·Έμμ λ³Ό (! OpenSSHλ₯Ό 6.7λ₯Ό μ€ννλ) μμμ λ°λΉμ 8.10 컨ν
μ΄λμ λν΄ μ€ν ssh 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 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
μμ΅λκΉ?
μ΄μ openssh-portableμ μμΈν μ΄ν΄λ³΄κ³ 무μμ΄ λ¬΄μμΈμ§ μ΄ν΄λ΄μΌ ν λλΌκ³ μκ°ν©λλ€.
session_input_channel_req
λ‘κ·Έ λΌμΈμ΄ λ°μνλ κ³³μ
λλ€. session_input_channel_req μμ μΈμ
μ ν(shell, pty open, exec, νμ μμ€ν
λ±)μ λ°λΌ λ€μν κΈ°λ₯μ κΈ°λ‘νκ³ λμ€ν¨μΉν©λλ€.exec
μ΄λ©° μ΄λ session_exec_req λ₯Ό μλ―Έ do_exec_pty
λ (μ°λ¦¬κ° PTYμ μμ²νμ§ μμκΈ° λλ¬Έμ μ°λ¦¬μ κ²½μ°; λ‘κ·Έ μ μ΄ TTY λ²νΈμ λν΄ μ‘°κΈμ΄ μκΈ° λλ¬Έμ λΉμ μ λ§ν μ) do_exec_no_ptyλν 2016λ 12μ https://github.com/paramiko/paramiko/pull/398#issuecomment -264281759μμμ κ°μ΄ κ³Όκ±°μ μ΄ μΆμ μ μΌλΆλ₯Ό _did_ νμ΅λλ€(κ·Έλ¬λ λ€λ₯Έ μ΄μ /μ΄μ μΌλ‘). μμ ν μκ³ μμλ€...
pstree
μμ μμ΄ λ³΄μ΄μ§ μλ μ΄μ λ execve
μ¬μ©νκΈ° λλ¬Έμ
λλ€. λ replace-me μ€νμΌμ exec νΈμΆμ μνν μ μμ΅λλ€. μλ μ£Όμμ μ°Έμ‘°νμΈμ.)
μ΄μ¨λ , κ·Έλμ! μ΄κ²μ μ¬μ ν ββFabric λ° OpenSSHμ ν΄λΌμ΄μΈνΈκ° μ
Έ μ€ν μΈ‘λ©΄μμ μ νν λμΌν μμ
μ μννκ³ μμμ μλ―Έν΄μΌ ν©λλ€. κ·Έλ€ μ€ λꡬλ νμ§ μλ κ²μ OpenSSH μ½λλ² μ΄μ€μ μ΄λ¬ν λΆλΆμ μμ νλ κ²μ
λλ€. @code-treeμ macOS μμ€ μ¬μ©μ λ° κ΅¬μ±λ μ
Έμ λ°λΌ bash
μ μ€μ κ°κ³Ό ν¨κ» νμ bash -c "python3 ./configure.py"
μ κ°μμΌ ν©λλ€.
env var transmissionμ΄ μ°¨λ³ν μμλΌλ λ΄ μ§κ°μ΄ μ ννμ§ κΆκΈν©λλ€. λ μ€ν νκ²½μ΄ μ΄λ»κ² λ€λ₯Ό μ μλμ§ μκ°ν μ μλ μ μΌν μ΄μ μ
λλ€. λ΄ CLI μ€μ¬ ν
μ€νΈμ FWIWμμ env
λ λ μμ€ν
λͺ¨λμμ λμΌνκ² λ³΄κ³ νλ©° λ€λ₯Έ νκ²½ κ΄λ ¨ λ¬Έμ μ κ΄κ³μμ΄ _default_ λμ(SSH 보μ μ μ±
μΌλ‘ μΈν΄)μ νμ λ‘컬 νκ²½μ΄ "λμ"λμ§ μμμΌ ν©λλ€. λ°λνΈ.
μ, 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
μ€μ λ‘ "μμ λ¨μΌ λͺ λ ΉμΌλ‘ κ΅μ²΄νλ μλ μ€ν"λμμ΄ bashμ κΈ°λ₯μ΄λΌκ³ μκ°ν©λλ€.
$ 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κ° μλ κ²μ μμ λ§ν¬λ λ€λ₯Έ ν°μΌμ μ°Έμ‘°νκ³ μμ§λ§ @code-treeκ° μ€μ λ‘ λ€λ₯Έ ν°μΌμ κ²½ννκ³
μ£μ‘ν©λλ€. μλͺ»λ κ²½λ³΄μΈ κ² κ°μ΅λλ€. ssh μΈλΌμΈμ ν΅ν΄ λͺ
λ Ήμ μ€ννλ κ²κ³Ό sshλ₯Ό ν΅ν΄ λ‘κ·ΈμΈν ν μ€ννλ κ² μ¬μ΄μ μ°¨μ΄κ° μλ€λ κ²μ μμ§ λͺ»νμ΅λλ€. ssh host 'echo $PATH'
νλ©΄ λ‘κ·ΈμΈ ν echo $PATH
κ° μ λλ‘ μλνλ PATHλ μ
λ°μ΄νΈλμ§ μμμ΅λλ€.
λλ μ¬μ ν sshκ° μ μ΄κ²μνλμ§ μ λ§λ‘ μ΄ν΄νμ§ λͺ»ν©λλ€ (μ€μ λ‘ ssh host 'bash -l -c "python3 ./configure.py"'
ν΄μΌ νλ κ² κ°μ΅λλ€). κ·ΈλΌμλ λΆκ΅¬νκ³ μ΄κ²μ κ²°κ΅ Fabric λ¬Έμ κ° μλλΌκ³ λ§νλ κ²μ΄ μμ ν©λλ€. νΌλμ λλ € μ£μ‘ν©λλ€.
@code-tree μμ μΈκΈν κ²κ³Ό κ΄λ ¨μ΄ μμ΅λλ€. μ Έμλ μλνλ λͺ κ°μ§ λ€λ₯Έ λͺ¨λκ° μμΌλ©°, νν 'λ‘κ·ΈμΈ' λ° 'λνν'μ΄λΌκ³ ν©λλ€(μΌλ°μ μΌλ‘ λ λ€ κ³ λ €λμ§ μλ κΈ°λ³Έ λͺ¨λ μμ μμ). μμ΄ μ€ν μ€μ΄λ©΄ λ‘λνλ rc νμΌ μΈνΈκ° λ³κ²½λ©λλ€.
μ¬κΈ°μ λλλ¬μ§ μ μ bash -c xxx
κ° "λνν"μΌλ‘ κ°μ£Όλμ§ μμΌλ―λ‘ .bash_profile
μ κ°μ νΉμ νμΌ λ‘λλ₯Ό 건λλ°μ§λ§ bash
μμ΄ -c
bash
λ₯Ό μ€ννλ€λ κ²μ
λλ€. μΌλ°μ μΌλ‘ λννμ΄λ©° νλ‘ν νμΌμ λ‘λν©λλ€.
μμμ 보μλ―μ΄ sshdλ λ¨μΌ λͺ
λ Ήμ μ€ννλλ‘ μμ²ν λ νμ bash -c <command send down the pipe>
λ₯Ό μ€ννλ―λ‘(Fabricκ³Ό κ°μ΄ λλ ssh host command
κ° μννλ κ²μ²λΌ) νμ λΉλνμ λͺ¨λμ μμ΅λλ€. (Fabric 1μ΄ νλ μΌμ νκ³ -l
μμ μ μ€μ²©λ μμ μ€ννμ§ μλ ν ...νμ§λ§ bash -c "bash -l -c \"oh god escaping is hard help\""
νκ³ μκ³ μ§κΈ κ°μ μΌλΆ π₯λ₯Ό κ°μ§λ €κ³ ν©λλ€.
μ΄μ¨λ λ€ μλ 건 μλλκΉ λͺ λ μ ν λ²μ© μ΄ λΆλΆμ λν κΈ°μ΅μ μλ‘κ³ μΉ¨ν΄μΌ νλ κ² κ°μΌλκΉ μ΄...μ΄μ κΈ°λΆμ΄ μμΎν΄ π
μ΄κ²μ λλ°μ΄ μλλΌ λ©μ§ μΌμ λλ€.
무μ bashλ νμΌνκΈ° μμν λ μμ€ κ²°μ μ λ³΅μ‘ ν μ http://blog.flowblok.id.au/2013-02/shell-startup-scripts.html νκ³ μλ λ°λΉμ / μ°λΆν¬ (λλΆλΆμ λ°°ν¬ν)κ° μΌλΆ μ¬μ©μ μ μ
/etc/profile
λ° κΈ°λ³Έ~/.bashrc
.fabμμ μ¬μ©νλ κΈ°λ³Έ μμ
/bin/bash -l -c
μ΄κ³-l
λ "λ‘κ·ΈμΈ" μλ‘ λ§λλλ€. debian/ubuntu μ¬μ©μ μ§μ μ΄ μμΌλ©΄ bash "login" μ Έμμ~/.bash_profile
λ₯Ό μμ±ν μ μμ§λ§~/.bashrc
λ μμ±ν μ μμ΅λλ€.κ·Έλ¬λ μ°λΆν¬ 16.04μμλ login-shellμ κ²½μ°μλ κΈ°λ³Έμ μΌλ‘
.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 ...
λ€μμ ν μ€νΈ μ€μΈ fabfileμ λλ€.
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: ...
λΉμ μ λ΄ μλͺ μ ꡬνμ΅λλ€. μ΄κ²μ λ΄κ° μ°Ύλ μλ²½ν λ΅λ³μ λλ€ :) λ§μ κ°μ¬ν©λλ€!
κ°μ₯ μ μ©ν λκΈ
μ΄κ²μ λλ°μ΄ μλλΌ λ©μ§ μΌμ λλ€.
무μ bashλ νμΌνκΈ° μμν λ μμ€ κ²°μ μ λ³΅μ‘ ν μ http://blog.flowblok.id.au/2013-02/shell-startup-scripts.html νκ³ μλ λ°λΉμ / μ°λΆν¬ (λλΆλΆμ λ°°ν¬ν)κ° μΌλΆ μ¬μ©μ μ μ
/etc/profile
λ° κΈ°λ³Έ~/.bashrc
.fabμμ μ¬μ©νλ κΈ°λ³Έ μμ
/bin/bash -l -c
μ΄κ³-l
λ "λ‘κ·ΈμΈ" μλ‘ λ§λλλ€. debian/ubuntu μ¬μ©μ μ§μ μ΄ μμΌλ©΄ bash "login" μ Έμμ~/.bash_profile
λ₯Ό μμ±ν μ μμ§λ§~/.bashrc
λ μμ±ν μ μμ΅λλ€.κ·Έλ¬λ μ°λΆν¬ 16.04μμλ login-shellμ κ²½μ°μλ κΈ°λ³Έμ μΌλ‘
.bashrc
λ₯Ό μμ±νλ κ²μΌλ‘ 보μ λλ€. κ·Έλ¬λ κΈ°λ³Έ.bashrc
μ 맨 μλμ μΆκ°λ νμ μ²λ¦¬λμ§ μμ΅λλ€. λΉλνν μ€νμ΄ κ°μ§λλ©΄ 맨 μ κ·Όμ²μμ ꡬμ λκΈ° λλ¬Έμ λλ€.μ¬κΈ°μ ubuntu-16.04 κΈ°λ³Έ μ¬μ©μ
.bashrc
μ λ μ€μ μΆκ°νμ΅λλ€.λ€μμ ν μ€νΈ μ€μΈ fabfileμ λλ€.
κ²°κ³Ό: