Chạy một lệnh trong shell tương tác với ssh sau khi tìm nguồn .bashrc


11

Tôi muốn ssh vào một máy tính Ubuntu từ xa, lấy nguồn của tôi .bashrcvà chạy một lệnh phụ thuộc vào các tham số được đặt bởi điều đó .bashrc. Tất cả những thứ đó trong một vỏ tương tác không đóng sau khi lệnh được thực hiện.

Những gì tôi đã cố gắng cho đến bây giờ là

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

hoặc chỉ

ssh user@remote_computer -t "my_alias;bash"

Điều này hoạt động cho các lệnh chung ( lsví dụ như) nhưng khi tôi cố chạy một bí danh được xác định trong .bashrctôi gặp lỗi:

bash: my_alias: command not found

Nhưng sau đó khi tôi viết lại bằng tay và chạy nó, nó hoạt động!

Vì vậy, làm thế nào tôi có thể chắc chắn rằng .bashrcnguồn có nguồn gốc trước khi lệnh được gọi?


Bài viết thật khó hiểu. Tôi khuyên bạn không nên lạm dụng các lệnh chạy như thế; tuy nhiên nếu bash hoặc một lệnh bash đang được gọi, tôi sẽ nói .bashrc phải chạy. Rõ ràng có một số khác biệt hoặc đặc thù của việc chạy một lệnh như vậy, và đối với các ứng dụng nghiêm trọng hơn, tôi muốn giới thiệu Ansible hoặc con rối.
Rui F Ribeiro

Tôi đã chỉnh sửa câu hỏi của tôi. Lệnh thứ hai đơn giản hơn và thực hiện tương tự, nhưng vẫn không có nguồn .bashrc trước đó.
Mehdi

@RuiFRibeiro Lạm dụng ?? Làm thế nào bạn có thể gọi một lạm dụng điều đơn giản như vậy ?? tự động chạy một lệnh sau khi đăng nhập vào một máy từ xa bằng ssh, nó đơn giản như vậy. Bất kỳ công cụ bên ngoài nào sẽ được triển khai cho một nhiệm vụ nhỏ đến mức lố bịch như vậy sẽ là một việc quá mức
Mehdi

1
Chỉ là một con số để nói, không có ý định được sử dụng trong một thuật ngữ rộng hơn. Sử dụng chúng khi bạn cần, tuy nhiên sử dụng chúng không phải là yên bình như nó có vẻ. Tuy nhiên, để tham khảo trong tương lai, hãy xem Ansible, bạn sẽ ngạc nhiên khi nó thực sự nhẹ như thế nào. Tôi thường chạy lệnh cũng thông qua ssh.
Rui F Ribeiro

Câu trả lời:


9

Vấn đề là bạn đang cố chạy một bí danh trong một vỏ không tương tác. Khi bạn chạy ssh user@computer command, commandđược chạy không tương tác.

Các vỏ không tương tác không đọc bí danh (từ man bash):

Các bí danh không được mở rộng khi shell không tương tác, trừ khi tùy chọn shell extend_aliases được đặt bằng shopt (xem mô tả về shopt trong SHELL BUILTIN THÔNG TIN bên dưới).

Nó hoạt động nếu bạn chạy lại thủ công vì bashlệnh cuối cùng bắt đầu một vỏ tương tác để bí danh của bạn hiện có sẵn.

Thay vào đó, bạn có thể khởi chạy shell tương tác ( bash -i) thay vì shell đăng nhập đơn giản ( bash -l) trên máy từ xa để chạy bí danh của mình:

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

Đây có vẻ là một cách tiếp cận rất phức tạp. Bạn đã không giải thích tại sao chính xác bạn cần phải làm điều này nhưng hãy xem xét các lựa chọn thay thế sau:

  1. Chỉ cần khởi động một vỏ tương tác đăng nhập bình thường trên máy từ xa và chạy lệnh thủ công:

    user@local $ ssh user@remote
    user@remote $ my_alias
    
  2. Nếu bạn luôn muốn bí danh đó được chạy khi bạn kết nối với máy tính này, hãy chỉnh sửa ~/.profile(hoặc ~/.bash_profile, nếu có) của máy tính từ xa và thêm dòng này vào cuối:

    my_alias

    Bởi vì ~/.profilelà đọc mỗi lần một vỏ đăng nhập được bắt đầu (vì vậy, mỗi khi bạn kết nối thông qua ssh, ví dụ), mà sẽ gây my_aliasđược chạy mỗi khi bạn kết nối.

    Lưu ý rằng theo mặc định, shell đăng nhập đọc ~/.profilehoặc ~/.bash_profilebỏ qua ~/.bashrc. Một số bản phân phối (ví dụ Debian và các dẫn xuất và Arch của nó) như các bản phân phối như Ubuntu có nguồn mặc định ~/.profilehoặc ~/.bash_profilenguồn tệp ~/.bashrc, điều đó có nghĩa là các bí danh của bạn được xác định trong ~/.bashrccũng sẽ có sẵn trong vỏ đăng nhập. Điều này không đúng với tất cả các bản phân phối, vì vậy bạn có thể phải chỉnh sửa ~/.profilethủ công để có nguồn ~/.bashrc. Cũng lưu ý rằng nếu ~/.bash_profiletồn tại, ~/.profilesẽ bị bỏ qua bởi bash.


Vì vậy, bạn có đề nghị có các bí danh được xác định trong một bí danh và gọi chúng từ .profile hoặc .bash_profile không?
Mehdi

@Mehdi sẽ phụ thuộc vào những gì bạn muốn làm. Trên hệ thống Ubuntu của bạn, ~/.basyrcđược tự động đọc bởi ~./profile, vì vậy mọi bí danh được xác định trong ~/.bashrccũng sẽ có sẵn cho bất kỳ trình đọc vỏ nào ~/.profile. Tất cả những gì bạn thực sự cần làm để làm cho điều này hoạt động là bắt đầu rõ ràng một shell tương tác ( -i).
terdon

5

Tôi đã phải nhận xét một phần .bashrc của mình để ngăn các bí danh được sử dụng và thêm lệnh extend_aliases. Điều này đã được bình luận

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

Và điều này đã được thêm vào

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

Sau đó, lệnh của tôi đã làm việc:

ssh user@remote_computer -t "my_alias;bash"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.