เรียกใช้คำสั่งในเชลล์แบบโต้ตอบด้วย ssh หลังจาก sourcing .bashrc


11

ฉันต้องการที่จะ SSH เข้าไปในคอมพิวเตอร์ Ubuntu ระยะไกลแหล่งที่มาของฉันและเรียกใช้คำสั่งที่ขึ้นอยู่กับพารามิเตอร์ที่กำหนดโดยที่.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

ฉันแก้ไขคำถามของฉัน คำสั่งที่สองนั้นง่ายกว่าและทำเช่นเดียวกัน แต่ก็ยังไม่มีการจัดหา. bashrc มาก่อน
เมห์

@RuiFRibeiro การใช้ผิดวิธี ?? คุณจะเรียกสิ่งนี้ว่าการละเมิดอย่างง่ายได้อย่างไร? เรียกใช้คำสั่งอัตโนมัติหลังจากเข้าสู่เครื่องระยะไกลด้วย ssh มันง่ายเหมือนที่ เครื่องมือภายนอกใด ๆ ที่จะถูกปรับใช้สำหรับงานเล็ก ๆ ที่น่าขันนี้จะเป็นงาน overkill
Mehdi

1
เพียงแค่ร่างของการพูดไม่ได้มีวัตถุประสงค์เพื่อใช้ในระยะที่กว้างขึ้น ใช้มันเมื่อคุณต้องการ แต่การใช้มันจะไม่สงบเท่าที่ควร อย่างไรก็ตามสำหรับการอ้างอิงในอนาคตได้ดู Ansible คุณจะประหลาดใจว่ามันมีน้ำหนักเบาจริงๆ ฉันมักจะเรียกใช้คำสั่งผ่าน ssh
Rui F Ribeiro

คำตอบ:


9

ปัญหาคือคุณพยายามเรียกใช้นามแฝงในเชลล์ที่ไม่มีการโต้ตอบ เมื่อคุณเรียกใช้ssh user@computer command, commandการเรียกใช้ที่ไม่โต้ตอบ

เชลล์ที่ไม่ใช่เชิงโต้ตอบไม่อ่านนามแฝง (จาก man bash):

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

ใช้งานได้หากคุณเรียกใช้อีกครั้งด้วยตนเองเนื่องจาก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การแจกแจงบางอย่าง (เช่น Debian และอนุพันธ์และ Arch เป็นต้น) การแจกแจงเช่น Ubuntu มีค่าเริ่มต้น~/.profileหรือ~/.bash_profileแหล่งไฟล์~/.bashrcซึ่งหมายความว่านามแฝงของคุณที่กำหนดไว้ใน~/.bashrcจะมีอยู่ในเปลือกเข้าสู่ระบบ นี้ไม่เป็นความจริงสำหรับการกระจายทั้งหมดดังนั้นคุณอาจต้องแก้ไขของคุณด้วยตนเองที่จะมีมันแหล่งที่มา~/.profile ~/.bashrcนอกจากนี้โปรดทราบว่าหาก~/.bash_profileมีอยู่~/.profileจะถูกละเว้นโดย bash


ดังนั้นคุณจะแนะนำให้กำหนดนามแฝงใน alias_profile และเรียกพวกเขาจาก. profile หรือ. bash_profile หรือไม่
เมห์

@ Mehdi ที่จะขึ้นอยู่กับสิ่งที่คุณต้องการจะทำ ในระบบอูบุนตูของคุณ~/.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.