เชลล์แบบไม่โต้ตอบขยายนามแฝง


12

ฉันมีปัญหาในการรับชื่อแทนเพื่อขยายบัญชีโฮสติ้งของฉันเมื่อฉันเรียกใช้คำสั่งเช่น:

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

ไฟล์. bashrc ของฉันคือ:

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"

เมื่อฉันเรียกใช้คำสั่ง ssh ฉันเห็น ".bashrc" echo'd แต่ถ้าฉันพยายามใช้นามแฝงฉันจะไม่ได้อะไรเลย

ฉันสามารถลอง "bash -ic" ได้ แต่นี่เป็นสคริปต์ที่ฉันไม่สามารถเปลี่ยนได้ง่ายและฉันต้องการทราบว่าทำไมจึงไม่ทำงาน

ผลผลิตของ 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

ผลผลิตของ ssh user@server "bash -c \"echo $SHELL\""

.bashrc
/bin/bash

ฉันเลิกและเพิ่งสร้าง symlink และสคริปต์ใน ~ / bin ที่ทำสิ่งเดียวกันกับที่ฉันต้องการด้วยชื่อแทน ตราบเท่าที่ฉันส่งออกของฉัน$PATHเป็น~/bin:$PATHมันทำงานได้ดี
Matt

บน Ubuntu (16.04 และที่ใหม่กว่านี้) ถ้าคุณมี~/.local/binเมื่อ/etc/profileมีการประมวลผลมันจะเพิ่มโดยอัตโนมัติไปยัง PATH ของคุณ คุณสามารถ. /etc/profileสร้างโฟลเดอร์เพื่อเพิ่มมันเข้าไปใน PATH ของคุณโดยไม่ต้องรีบูตหรือออกจากระบบ / ล็อกอิน
dragon788

คำตอบ:


15

จากbash(1)หน้าคน:

นามแฝงจะไม่ถูกขยายเมื่อเชลล์ไม่ได้ทำงานยกเว้นว่าตัวเลือกเชลล์ expand_aliases ถูกตั้งค่าโดยใช้ shopt (ดูคำอธิบายของ shopt ภายใต้คำสั่ง SHELL BUILTIN ด้านล่าง)


5
ฉันมีshopt -s expand_aliasesใน. bashrc ของฉัน แต่นั่นดูเหมือนจะไม่ทำงาน ฉันไม่แน่ใจว่าทำไมถึงไม่เป็นเช่นนั้น แต่ฉันเดาว่านี่จะเป็นคำตอบปกติ
แมตต์

@ Matt ผมไม่แน่ใจว่าคำสั่งของ 'เหตุการณ์' แต่คุณไม่พยายามทำให้แน่ใจว่าshopt -s expand_aliasesอยู่ในของคุณ.bashrcก่อนที่จะนามแฝง? แน่นอนว่าการส่งออกของคุณในรายการคำถามคือexpand_aliases off
สีแดงนกกระยาง

ใช่เห็น. bashrc ในคำถามของฉัน ฉันเห็นเส้นเสียงสะท้อน แต่shoptแสดงว่าปิด อาจจะมีแค่การตั้งค่าเซิร์ฟเวอร์แปลก ๆ ที่ป้องกันสิ่งนี้ฉันไม่รู้ ฉันมีวิธีแก้ปัญหา
Matt

อาจเป็นเพราะ.bashrcไฟล์นั้นไม่ได้รับการจัดหามาโดยปริยาย
Daniel Farrell

8

เชลล์ที่คุณได้รับเมื่อคุณรันคำสั่งจากระยะไกลด้วย SSH ไม่ใช่เชลล์แบบโต้ตอบและล็อกอินเชลล์:

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

(ไม่มีiและไม่มีlในการตอบสนอง)

ในกรณีของ Bash นั่นหมายความว่าไม่มีการอ่านไฟล์การเริ่มต้นปกติ

คุณสามารถบังคับเปลือกระยะไกลจะเป็นเปลือกเข้าสู่ระบบโดยการเพิ่ม-lการภาวนาทุบตีของคุณซึ่งหมายความว่ามันจะแยกคนแรกของ~/.bash_profile, ~/.bash_loginและ~/.profileว่ามันสามารถค้นหาการค้นหาในลำดับที่ ~/.bashrcแต่ไม่ได้ หมายความว่าคุณจะต้องใส่ชื่อแทนในไฟล์เหล่านั้นแทน


ฟังดูเหมือนทางออก ฉันไม่ได้ใช้เซิร์ฟเวอร์นี้อีกต่อไปดังนั้นฉันจึงไม่สามารถทดสอบได้ แต่อาจคุ้มค่าที่จะอัปเดตสิ่งนี้ในกรณีที่คนอื่นพบคำถาม
Matt

2

ฉันมีปัญหาเดียวกันและในตอนแรกshopt -s expand_aliasesดูเหมือนจะไม่ช่วย สิ่งที่ฉันพบคือตัวเลือกนี้ควรตั้งค่าก่อนที่จะเพิ่มชื่อแทนจริง ดังนั้นหากชื่อแทนถูกสร้างขึ้นก่อนที่คุณจะ.bashrcตั้งค่าexpand_aliasesตัวเลือกพวกเขาจะไม่สามารถใช้ได้ ดังนั้นคุณควรโหลดนามแฝง (หรือโหลดซ้ำ) หลังจากตั้งค่าตัวเลือก


0

ทุบตี (1) พูดว่า

...

เมื่อเชลล์เชิงโต้ตอบที่ไม่ใช่เชลล์ล็อกอินเริ่มทำงาน bash จะอ่านและดำเนินการคำสั่งจาก ~ / .bashrc หากไฟล์นั้นมีอยู่

...

เชลล์แบบโต้ตอบเริ่มต้นหนึ่งโดยไม่มีอาร์กิวเมนต์ที่ไม่ใช่ตัวเลือกและไม่มีตัวเลือก -c ซึ่งทั้งอินพุตและข้อผิดพลาดมาตรฐานเชื่อมต่อกับเทอร์มินัล (ตามที่กำหนดโดย isatty (3)) หรือเริ่มด้วยตัวเลือก -i

ดังนั้นเห็นได้ชัดว่าคุณแหล่ง. bashrc ด้วยตนเองหรือรันด้วย -i

หากนามแฝงคือทั้งหมดที่คุณต้องการฉันขอแนะนำให้แยกพวกเขาออกไปในเช่น. aliases และจากนั้นแหล่งที่มาจากทั้ง. bashrc และสคริปต์ของคุณในกรณีที่สิ่งต่างๆเกิดขึ้นใน. bashrc ที่อาจทำให้สคริปต์ของคุณเสียหาย


ดังนั้นฉันจึงเห็นว่า. bashrc มีที่มา ฉันเห็นบรรทัด echo จาก. bashrc เมื่อฉันรันคำสั่ง ปัญหาคือนามแฝงในไฟล์นั้นไม่ขยาย
Matt

0

คุณสามารถแก้ปัญหาใด ๆ โดยการป้อน:

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

ที่บรรทัดแรก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.