Nicht interaktiver Shell-Erweiterungsalias

12

Ich habe Probleme, Aliase für mein Hosting-Konto zu erweitern, wenn ich einen Befehl wie den folgenden ausführe:

ssh user@server "bash -c \"alias\""

Meine .bashrc-Datei lautet:

echo .bashrc
# .bashrc

shopt -s expand_aliases

# Source global definitions (commenting this out does nothing)
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

# User specific aliases and functions
alias php="php55"
alias composer="php ~/bin/composer.phar"

Wenn ich den obigen Befehl ssh ausführe, wird ".bashrc" als Echo angezeigt. Aber wenn ich versuche, Aliase auszuführen, bekomme ich nichts.

Ich könnte "bash -ic" ausprobieren, aber dies ist tatsächlich in einem Skript, das ich nicht einfach ändern kann, und ich möchte wissen, warum dies nicht funktioniert.

Ausgabe von ssh user@server "bash -c \"shopt\""

.bashrc
autocd          off
cdable_vars     off
cdspell         off
checkhash       off
checkjobs       off
checkwinsize    off
cmdhist         on
compat31        off
compat32        off
compat40        off
dirspell        off
dotglob         off
execfail        off
expand_aliases  off
extdebug        off
extglob         off
extquote        on
failglob        off
force_fignore   on
globstar        off
gnu_errfmt      off
histappend      off
histreedit      off
histverify      off
hostcomplete    on
huponexit       off
interactive_comments    on
lithist         off
login_shell     off
mailwarn        off
no_empty_cmd_completion off
nocaseglob      off
nocasematch     off
nullglob        off
progcomp        on
promptvars      on
restricted_shell        off
shift_verbose   off
sourcepath      on
xpg_echo        off

Ausgabe von ssh user@server "bash -c \"echo $SHELL\""

.bashrc
/bin/bash
Matt
quelle
Ich habe aufgegeben und gerade Symlinks und Skripte in ~ / bin erstellt, die das gleiche tun, was ich mit Aliasnamen wollte. Solange ich meine exportieren , $PATHwie ~/bin:$PATHes gut funktioniert.
Matt
Unter Ubuntu (16.04 und sicher neuer) wird das automatisch zu Ihrem PATH hinzugefügt, wenn Sie ein haben, ~/.local/binwenn das /etc/profileverarbeitet wird. Sie können . /etc/profileden Ordner auch direkt nach dem Erstellen erstellen, um ihn ohne Neustart oder Abmelden / Anmelden zu Ihrem PATH hinzuzufügen.
Dragon788

Antworten:

14

Von der bash(1)Manpage:

Aliase werden nicht erweitert, wenn die Shell nicht interaktiv ist, es sei denn, die Shell-Option expand_aliases wird mit shopt festgelegt (siehe Beschreibung von shopt unter SHELL BUILTIN-BEFEHLE unten).

Purpurreiher
quelle
5
Ich habe zwar shopt -s expand_aliasesin meinem .bashrc, aber das scheint nicht zu funktionieren. Ich bin mir nicht sicher, warum nicht, aber ich denke, das wäre normalerweise die Antwort
Matt
@Matt Ich bin mir nicht sicher, in welcher Reihenfolge "Ereignisse" angezeigt werden, aber haben Sie versucht, sicherzustellen, dass die Reihenfolge vor den Aliasnamen shopt -s expand_aliasesin Ihrer ist .bashrc? Sicherlich, die Ausgabe in der Frage zeigt expand_aliasesist off.
Purpurreiher
Ja, siehe die .bashrc in meiner Frage. Ich sehe die Echolinie, shoptzeige sie aber als ausgeschaltet an. Vielleicht gibt es nur eine seltsame Servereinstellung, die dies verhindert, ich weiß es nicht. Ich habe eine Problemumgehung
Matt
Wahrscheinlich wurde die .bashrcDatei nicht standardmäßig bezogen.
Daniel Farrell
8

Die Shell, die Sie erhalten, wenn Sie einen Befehl remote mit SSH ausführen, ist weder eine interaktive Shell noch eine Login-Shell:

$ ssh server 'bash -c "echo $-"'
chsB

(Es gibt kein iund kein lin der Antwort)

In Bashs Fall bedeutet dies, dass keine der üblichen Initialisierungsdateien gelesen wird.

Sie können den Remote - Shell zwingen , ein Login - Shell , indem zu sein , -lum Ihren Bash Aufruf, was bedeutet , dass sie die ersten von analysieren würden ~/.bash_profile, ~/.bash_loginund ~/.profiledass es nicht finden, in dieser Reihenfolge suchen, aber nicht ~/.bashrc. Dies bedeutet, dass Sie Ihre Aliase stattdessen in eine dieser Dateien einfügen müssen.

Kusalananda
quelle
Das klingt nach der Lösung. Ich benutze diesen Server nicht einmal mehr, daher kann ich ihn nicht testen, aber es lohnt sich wahrscheinlich, ihn zu verbessern, falls jemand anderes die Frage findet.
Matt
2

Ich hatte das gleiche Problem und shopt -s expand_aliasesschien zunächst nicht zu helfen. Was ich herausgefunden habe ist, dass diese Optionen festgelegt werden sollten, bevor die tatsächlichen Aliase hinzugefügt werden. Wenn also Aliase erstellt werden, bevor Sie .bashrcdie expand_aliasesOptionen festlegen, sind sie nicht verfügbar. Daher sollten Sie Aliase laden (oder neu laden), nachdem Sie die Option festgelegt haben.

Gene Pavlovsky
quelle
0

Bash (1) sagt

...

Wenn eine interaktive Shell gestartet wird, die keine Anmeldeshell ist, liest bash Befehle von ~ / .bashrc und führt sie aus, sofern diese Datei vorhanden ist.

...

Eine interaktive Shell wird ohne Argumente ohne Option und ohne die Option -c gestartet, deren Standardeingabe und Fehler beide mit Terminals verbunden sind (wie durch isatty (3) bestimmt), oder mit der Option -i gestartet.

Offensichtlich geben Sie .bashrc entweder manuell ein oder führen es mit -i aus

Wenn Aliase alles sind, was Sie brauchen, würde ich empfehlen, sie in zB .aliases aufzuteilen und diese dann sowohl aus .bashrc als auch aus Ihrem Skript zu beziehen, nur für den Fall, dass in .bashrc Dinge auftauchen, die Ihr Skript beschädigen könnten, wie es häufig vorkommt

Aleksandar Ivanisevic
quelle
Ich sehe also, dass .bashrc beschafft wird. Ich sehe die Echozeile von .bashrc, wenn ich den Befehl ausführe. Das Problem ist, dass Aliase in dieser Datei nicht erweitert werden.
Matt
0

Sie können jedes Problem lösen, indem Sie Folgendes eingeben:

if [ -f /etc/skel/.bashrc ]; then . /etc/skel/.bashrc; fi

in der ersten Zeile.

Riccardo La Marca
quelle