.bashrcをソースした後、sshを使用して対話型シェルでコマンドを実行します。


11

リモートのUbuntuコンピューターにSSHで接続し、myを入手して、.bashrcそのパラメーターで設定されたパラメーターに依存するコマンドを実行します.bashrc。これらはすべて、コマンドの実行後に閉じないインタラクティブシェル内にあります。

今までやってみました

ssh user@remote_computer -t 'bash -l -c "my_alias;bash"'

あるいは単に

ssh user@remote_computer -t "my_alias;bash"

これは一般的なコマンド(lsたとえば)で機能しますが、で定義されたエイリアスを実行しようとすると.bashrc、エラーが発生します。

bash: my_alias: command not found

しかし、もう一度手動で記述して実行すると、うまくいきます。

では.bashrc、コマンドが呼び出される前にが確実にソースされるようにするにはどうすればよいですか?


投稿は混乱しています。そのような実行中のコマンドを乱用しないことをお勧めします。それにもかかわらず、bashまたはbashコマンドが呼び出されている場合、.bashrcが実行されることになっています。そのようなコマンドを実行することには明らかにいくつかの違いまたは特殊性があり、より深刻なアプリケーションでは、Ansibleまたはパペットをお勧めします。
Rui F Ribeiro

質問を編集しました。2番目のコマンドはより単純で同じことを行いますが、以前は.bashrcをソースしていません。
Mehdi、2015年

@RuiFRibeiro虐待?? どのようにあなたはそんな単純なことを虐待と呼ぶことができますか?sshを使用してリモートマシンにログインした後にコマンドを自動的に実行することは、それと同じくらい簡単です。このような途方もなく小さなタスクのために配備される外部ツールは、やりすぎです
Mehdi

1
ほんの少しの数字ですが、より広い用語での使用を意図したものではありません。必要なときに使用してください。ただし、見た目ほど平和ではありません。それにもかかわらず、今後の参考のために、Ansibleを見てください。実際にそれがどれほど軽量であるかは驚くでしょう。私はしばしばssh経由でコマンドも実行します。
Rui F Ribeiro

回答:


9

問題は、非対話型シェルでエイリアスを実行しようとしていることです。を実行するとssh user@computer commandcommandは非対話的に実行されます。

非対話型シェルはエイリアスを読みません(man bashから):

シェルがインタラクティブでない場合、エイリアスは展開されません。ただし、expand_aliasesシェルオプションがshoptを使用して設定されている場合を除きます(下記のシェルビルドコマンドの下のshoptの説明を参照してください)。

最後のbashコマンドがインタラクティブシェルを起動してエイリアスを使用できるようになるため、手動で再度実行すると機能します。

別の方法として、リモートマシンでbash -i単純なログインシェル(bash -l)の代わりにインタラクティブシェル()を起動して、エイリアスを実行することもできます。

ssh user@remote_computer -t 'bash -ic "my_alias;bash"'

ただし、これは非常に複雑なアプローチのようです。正確にこれを行う必要がある理由を説明していませんが、次の代替案を検討してください。

  1. リモートマシンで通常のログインインタラクティブシェルを起動し、コマンドを手動で実行するだけです。

    user@local $ ssh user@remote
    user@remote $ my_alias
  2. このコンピューターに接続するときに常にそのエイリアスを実行する場合は、リモートコンピューターの~/.profile~/.bash_profile存在する場合は)を編集し、最後に次の行を追加します。

    my_alias

    ので~/.profile、ログインシェルを起動するたびに読んで(そう、あなたが経由で接続するたびssh例えばは、)、それが原因となりmy_alias、あなたが接続するたびに実行されます。

    デフォルトでは、ログインシェルは~/.profileまたは~/.bash_profileを読み取り、無視し~/.bashrcます。Ubuntuなどの一部のディストリビューション(Debianとその派生物、Archなど)のディストリビューションには、デフォルト~/.profileまたは~/.bash_profileファイルソースが~/.bashrcあります。つまり、で定義されたエイリアス~/.bashrcは、ログインシェルでも使用できます。これはすべてのディストリビューションに当てはまるわけではないため、~/.profileソースを入手するには手動で編集する必要がある場合があります~/.bashrc。また、~/.bash_profile存在する場合、~/.profilebashによって無視されます。


では、alias_profileでエイリアスを定義し、.profileまたは.bash_profileからそれらを呼び出すことをお勧めしますか?
Mehdi

@Mehdiそれはあなたが何をしたいかに依存します。Ubuntuシステムで~/.basyrcは、はによって自動的に読み取られる~./profileため、で定義されているエイリアスは、~/.bashrcを読み取るすべてのシェルでも使用できます~/.profile。これを機能させるために本当に必要なことは、明示的に対話型シェル(-i)を起動することだけでした。
terdon

5

エイリアスの使用を妨げている.bashrcの一部にコメントし、expand_aliasesコマンドを追加する必要がありました。これはコメントされました

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

そして、これが追加されました

if [ -z "$PS1" ]; then
  shopt -s expand_aliases
fi

次に、私のコマンドは機能しました:

ssh user@remote_computer -t "my_alias;bash"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.