Fabric: リモヌトサヌバヌの環境倉数ずPATHに問題がありたす.bashrcを゜ヌシングしおいたせん

䜜成日 2016幎10月09日  Â·  22コメント  Â·  ゜ヌス: fabric/fabric

やあ、

fabのrunコマンドを実行しおいく぀かの環境倉数を远加し、パス倉数を展開するずきに、.bashrcファむル぀たり、゜ヌス/home/ubuntu/.bashrcをロヌドしようずしおいたす。

run 'source /home/ubuntu/.bashrc && echo $ PATH'

これは私だけを瀺しおいたす

[[email protected]] out/ usr / local / sbin/ usr / local / bin/ usr / sbin/ usr / bin/ sbin / bin/ usr / games/ usr / local / games

リモヌトサヌバヌに手動でログむンしたずきに衚瀺されるパスのリストがはるかに長くなる代わりに。

リモヌトホヌムディレクトリに.bashrcファむルを正しくむンポヌトするようにfabを取埗するにはどうすればよいですか

ありがずうございたした

最も参考になるコメント

これはbashのものであり、fabのものではありたせん。

bashが起動時に゜ヌスするこずを決定するファむルは耇雑になる可胜性がありたすhttp://blog.flowblok.id.au/2013-02/shell-startup-scripts.htmlおよびdebian / ubuntuおよびほずんどのディストリビュヌションは/etc/profileでいく぀かのカスタマむズがあり~/.bashrc 。

デフォルトのシェルファブが䜿甚するのは/bin/bash -l -cで、 -lはそれを「ログむン」シェルにしたす。 debian / ubuntuのカスタマむズがないず、bashの「ログむン」シェルが~/.bash_profileが、 ~/.bashrcはできたせん。

しかし、ubuntu 16.04では、ログむンシェルの堎合でもデフォルトで.bashrcしおいるようです。 ただし、デフォルトの.bashrcの䞋郚に远加された行は、非察話的に実行されおいるこずを怜出するず䞊郚近くでベむルアりトするため、凊理されたせん。

ここでは、ubuntu-16.04のデフォルトナヌザヌ.bashrc 2行を远加したした

# ~/.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: 
...

党おのコメント22件

これはbashのものであり、fabのものではありたせん。

bashが起動時に゜ヌスするこずを決定するファむルは耇雑になる可胜性がありたすhttp://blog.flowblok.id.au/2013-02/shell-startup-scripts.htmlおよびdebian / ubuntuおよびほずんどのディストリビュヌションは/etc/profileでいく぀かのカスタマむズがあり~/.bashrc 。

デフォルトのシェルファブが䜿甚するのは/bin/bash -l -cで、 -lはそれを「ログむン」シェルにしたす。 debian / ubuntuのカスタマむズがないず、bashの「ログむン」シェルが~/.bash_profileが、 ~/.bashrcはできたせん。

しかし、ubuntu 16.04では、ログむンシェルの堎合でもデフォルトで.bashrcしおいるようです。 ただし、デフォルトの.bashrcの䞋郚に远加された行は、非察話的に実行されおいるこずを怜出するず䞊郚近くでベむルアりトするため、凊理されたせん。

ここでは、ubuntu-16.04のデフォルトナヌザヌ.bashrc 2行を远加したした

# ~/.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 config valueオプションがあるため、IIRCが「むンタラクティブモヌドを実行しおいく぀かの远加ファむルを調達する」ためのbashである-iなどのフラグを远加しおみおください。

私はバヌゞョン2.2.1を䜿甚しおいるので、それは奇劙です。 私は珟圚、アプリを機胜させるために次のこずを行う必芁がありたす。
c.run('bash -l -c "python3 ./configure.py"')
Python 3をむンストヌルしたずきず同じように、Fabricによっお実行されおいない.bash_profileを介しおPATHに远加されたした。 暙準の組み蟌みsshd構成にも倉曎を加えおいたせん。

それは奇劙なこずです、私は私が耇補できるかどうかを芋なければなりたせん。 私が䜕を意味するのかを蚌明するために、簡単な健党性トレヌスを実行したした。reファブリック2は䜕もしおいたせん '特別な' resshd駆動の実行

@ code-treeも、可胜であれば、実行しおいる内容ずその他の環境の詳现クラむアントずサヌバヌのOS /バヌゞョンなどに関する詳现を投皿しおください。

確かに、私は叀いOSXバヌゞョンをサヌバヌずしお実行しおいたす。 新しいMacOSですべおが正垞に機胜するこずを確認できれば、たあたあ。 しかし、そうでない堎合は、䞀般的なサヌバヌずしおのMacOSの問題でしょうか

  • クラむアントUbuntu 16.04、Python 3.6.6、OpenSSH 7.2p2、Bash 4.3.48、Fabric 2.2.1
  • サヌバヌOSX 10.11、Python 3.6.6、OpenSSH 6.9p1、Bash 3.2.57

ちなみに、これが実際に誀蚺のケヌスであるかどうか疑問に思っおいたす。

OSXで.bash_profileを実行しおいないため、ファブリックのPATH倀が異なりたす

代わりに、これは1744の䟋である可胜性がありたす。ここで、ファブリック2は、ロヌカル環境倉数をパむプにシャントするずいう点でsshずは異なりたすか 問題の正確なenv倉数ず、それらがロヌカルずリモヌトで類䌌しおいるかどうかによっお異なりたす。@ code-treeは、ロヌカルずリモヌトのbash_profileで正確な倀を再確認するこずで、この理論を簡単に反蚌できたす...😁


しかし、ずにかくこれを盎接トラブルシュヌティングする぀もりです。それで、私は気が狂っおいないこずがわかりたす。シェルず゜ヌスファむルに関しおsshdが䜕をしおいるのかを理解しおいたす。

たた、これは1816のシナリオ/むンテリゞェンスに関連しおいるのではないかず思いたす。これもシェルずスタヌトアップファむルに関するものです。 ssh䞀方向に動䜜し、Fabricが別の方向に動䜜する「sshdが通垞シェルを呌び出す方法」ではないずいうアサヌションがあるため、盎接関係はありたせんが、ずにかくリンクする䟡倀がありたす。

これらの線に沿った䜕かに関連しお、私が過去数ヶ月に行ったこずを芚えおいるたくさんの深いsshdコヌドダむビングに぀たずこうずしおいるこずがわかりたした。 むラむラしたすが、今は芋぀かりたせん。 線集ああ、認蚌前にコマンドを実行するこずに関しお、それは無関係のParamikoの問題混乱する点がないためリンクされおいないだったず思いたす。 わかった。

では、コマンドexecを芁求するず、実際に䜕が起こっおいるのでしょうか。

  • SSH-the-protocolでは、 shellチャネル芁求ナヌザヌが定矩したログむンシェルプログラムをロヌドし、 command たたはexecチャネルを䜜成する必芁がありたす。リク゚スト「パスが含たれおいる可胜性のある特定のコマンド文字列を実行する」ずだけ衚瀺され、それ以䞊は指定されたせん
  • 䞊で芋぀けたように、Paramikoは埌者を行いたす。
  • では、OpenSSH自䜓は実際に䜕をしおいるのでしょうか。 私はopenssh-portableのロヌカルチェックアりトを芋おいきたす 775f8a23f2353f5869003c57a213d14b28e0736e 

さお、最初に少し間抜けしたす。 任意のDebian8.10コンテナOpenSSH 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

OK、圌らは䞡方ずもexecやっおいたす...それは予想されるこずです。 プロセスツリヌに䜕か違いはありたすか あるべきではありたせん、そしお...ありたせん。 どちらも次のようになりたす。

sshd,1 -D -e
  └─sshd,1535
      └─pstree,1537 -alpU

だから、間違いなくシェルは機胜しおいたせんか 䜕しおるの &&ようなシェルのようなものを䜿甚できたすか

できたす たずえば、 whoami && idは正垞に機胜したす。 ぀たり、Unixプロセス制埡に぀いおの私の理解を考えるず、これは少し奇劙です。 sshdが文字通りexec(string)実行しおいる可胜性は䜎いようですが、シェルを䜿甚しお解釈しおいる堎合は、 pstreeたせんか

opensh-portableを実際に掘り䞋げお、䜕が䜕であるかを確認する時が来たず思いたす。


たた、2016幎12月のように、過去にこのトレヌスの䞀郚を実行したしたただし、理由や焊点が異なりたす https //github.com/paramiko/paramiko/pull/398#issuecomment-264281759。 完党に忘れおいた...


pstreeシェルが衚瀺されない理由は、子を生成する代わりに芪プロセスを眮き換えるexecveを䜿甚しおいるためです。 知っおおくず良い。 線集間違っお、ちょうどシェルずのsshd子PROCに取っお代わるこずを、シェル自䜓はその埌も眮き換える-私にスタむルのexec呌び出しを行うこずができ、コメントは䞋蚘を参照しおください。


ずにかくそう これは、FabricずOpenSSHのクラむアントがシェルの実行に関しおたったく同じこずをしおいるこずを意味するはずです。 それらのどちらも、OpenSSHのコヌドベヌスのこれらの郚分を倉曎するこずはありたせん。 それはい぀ものようなものでなければなりたせんbash -c "python3 ./configure.py"の実際の倀ず、 bash @コヌドツリヌのMacOSのレベルのナヌザヌずその構成されたシェルによっお異なりたす。

env var䌝送が差別化芁因であるずいう私の予感が正確であるかどうか疑問に思いたす。それは、2぀の実行環境がどのように異なるかずいうこずに぀いお私が考えるこずができる他の唯䞀のこずだからです。 私のCLIに焊点を圓おたテストのFWIWでは、 envは䞡方のシステムで同じこずを報告し、他の環境関連の問題に関係なく、SSHセキュリティポリシヌによる_default_の動䜜は垞にロヌカル環境が「リヌク」しないこずです。反察偎。

ええ、私は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 yeaは、䞊蚘でリンクされおいる他のチケットを参照しおいたすが、@ code-treeが実際にそれらずは異なる症状を経隓しおいるかどうかは

申し蚳ありたせんが、これは誀報だず思いたす。 sshむンラむンを介しおコマンドを実行するこずず、sshを介しおログむンした埌に実行するこずの間に違いがあるこずに気づいおいたせんでした。 ssh host 'echo $PATH'するず、PATHも曎新されたせんが、ログむン埌のecho $PATH正垞に機胜したす。

sshがこれを行う理由はただわかりたせん実際にssh host 'bash -l -c "python3 ./configure.py"'実行する必芁があるようです。 ずにかく、これは結局のずころファブリックの問題ではないず蚀っおも過蚀ではありたせん。 混乱させお申し蚳ありたせん。

@ code-treeこれは、前述の内容に関連しおいたす-シェルには、動䜜するいく぀かの異なるモヌドがあり、「ログむン」および「むンタラクティブ」ず呌ばれるこずがよくありたす通垞、これらはどちらずも芋なされない基本モヌドの䞊にありたす。シェルが実行されおいるずきに、ロヌドするrcファむルのセットが倉曎されたす。

ここでの重芁な点は、 bash -c xxxは「むンタラクティブ」ずは芋なされないため、 .bash_profileなどの特定のファむルの読み蟌みをスキップしたすが、 -cなしでbashを実行するだけです。通垞はむンタラクティブで、プロファむルファむルをロヌドしたす。

䞊で芋たように-sshdは、単䞀のコマンドを実行するように芁求するずFabricが実行するように、たたはssh host commandが実行するように、垞にbash -c <command send down the pipe>を実行するため、垞に非察話モヌドになりたす。 Fabric 1が行うこずを実行し、 -lお独自のネストされたシェルを実行しない限り...しかし、 bash -c "bash -l -c \"oh god escaping is hard help\""を実行しおいるので、これからいく぀か🥃を実行したす。

ずにかく、すべおが倱われるわけではありたせん。数幎ごずにこの郚分の蚘憶を曎新する必芁があるようです。そうですね...今は曎新されおいたす😆

これはbashのものであり、fabのものではありたせん。

bashが起動時に゜ヌスするこずを決定するファむルは耇雑になる可胜性がありたすhttp://blog.flowblok.id.au/2013-02/shell-startup-scripts.htmlおよびdebian / ubuntuおよびほずんどのディストリビュヌションは/etc/profileでいく぀かのカスタマむズがあり~/.bashrc 。

デフォルトのシェルファブが䜿甚するのは/bin/bash -l -cで、 -lはそれを「ログむン」シェルにしたす。 debian / ubuntuのカスタマむズがないず、bashの「ログむン」シェルが~/.bash_profileが、 ~/.bashrcはできたせん。

しかし、ubuntu 16.04では、ログむンシェルの堎合でもデフォルトで.bashrcしおいるようです。 ただし、デフォルトの.bashrcの䞋郚に远加された行は、非察話的に実行されおいるこずを怜出するず䞊郚近くでベむルアりトするため、凊理されたせん。

ここでは、ubuntu-16.04のデフォルトナヌザヌ.bashrc 2行を远加したした

# ~/.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: 
...

あなたは私の呜を救いたした。 これは私が芋぀けた完璧な答えです:)どうもありがずう

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡