Jalankan perintah dalam shell interaktif dengan ssh setelah sumber .bashrc

11

Saya ingin ssh ke komputer remote Ubuntu, sumber saya .bashrcdan jalankan perintah yang tergantung pada parameter yang ditetapkan oleh itu .bashrc. Semua itu dalam shell interaktif yang tidak menutup setelah perintah selesai.

Yang saya coba sampai sekarang adalah

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

atau hanya

ssh user@remote_computer -t "my_alias;bash"

Ini berfungsi untuk perintah umum (seperti lsmisalnya) tetapi ketika saya mencoba menjalankan alias yang didefinisikan di dalam .bashrcsaya mendapatkan kesalahan:

bash: my_alias: command not found

Tetapi kemudian ketika saya menulisnya kembali secara manual dan menjalankannya, itu berhasil!

Jadi bagaimana saya bisa memastikan .bashrcsumbernya sebelum perintah dipanggil?

Mehdi
sumber
Posnya membingungkan. Saya merekomendasikan untuk tidak menyalahgunakan menjalankan perintah seperti itu; namun jika bash atau perintah bash sedang dijalankan saya akan mengatakan .bashrc seharusnya dijalankan. Jelas ada beberapa perbedaan atau kekhasan menjalankan perintah seperti itu, dan untuk aplikasi yang lebih serius, saya akan merekomendasikan Ansible atau boneka.
Rui F Ribeiro
Saya mengedit pertanyaan saya. Perintah kedua lebih sederhana dan melakukan hal yang sama, tetapi masih tanpa sumber .bashrc sebelumnya.
Mehdi
@RuiFRibeiro Abuse ?? bagaimana Anda bisa menyebut penyalahgunaan hal sederhana itu ?? secara otomatis menjalankan perintah setelah masuk ke mesin jarak jauh dengan ssh, sesederhana itu. Alat eksternal apa pun yang akan dikerahkan untuk tugas sekecil ini akan menjadi berlebihan
Mehdi
1
Hanya kiasan, tidak dimaksudkan untuk digunakan dalam istilah yang lebih luas. Gunakan saat Anda membutuhkannya, namun menggunakannya tidak se-damai kelihatannya. Namun demikian, untuk referensi di masa mendatang, lihat Ansible, Anda akan kagum betapa ringannya itu sebenarnya. Saya sering menjalankan perintah juga melalui ssh.
Rui F Ribeiro

Jawaban:

9

Masalahnya adalah Anda mencoba menjalankan alias di shell non-interaktif. Ketika Anda menjalankan ssh user@computer command, commandjalankan non-interaktif.

Kerang non-interaktif tidak membaca alias (dari man bash):

Alias ​​tidak diperluas ketika shell tidak interaktif, kecuali jika opsi shell expansion_aliases diatur menggunakan shopt (lihat deskripsi shopt di bawah SHELL BUILTIN COMMANDS di bawah).

Ini berfungsi jika Anda menjalankannya lagi secara manual karena bashperintah terakhir memulai shell interaktif sehingga alias Anda sekarang tersedia.

Sebagai alternatif, Anda dapat meluncurkan shell interaktif ( bash -i) alih-alih shell login sederhana ( bash -l) pada mesin jarak jauh untuk menjalankan alias Anda:

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

Ini tampaknya pendekatan yang sangat rumit. Anda belum menjelaskan mengapa Anda harus melakukan ini, tetapi pertimbangkan alternatif berikut:

  1. Mulai saja shell interaktif masuk normal pada mesin jarak jauh dan jalankan perintah secara manual:

    user@local $ ssh user@remote
    user@remote $ my_alias
    
  2. Jika Anda selalu ingin alias dijalankan ketika Anda terhubung ke komputer ini, edit ~/.profile(atau ~/.bash_profile, jika ada) komputer jarak jauh dan tambahkan baris ini di akhir:

    my_alias

    Karena ~/.profiledibaca setiap kali shell login dimulai (jadi, setiap kali Anda terhubung melalui ssh, misalnya), yang akan menyebabkan my_aliasdijalankan setiap kali Anda terhubung.

    Perhatikan bahwa secara default, shell login membaca ~/.profileatau ~/.bash_profilemengabaikan ~/.bashrc. Beberapa distribusi (Debian dan turunannya dan Arch, misalnya) distribusi seperti Ubuntu memiliki sumber default ~/.profileatau ~/.bash_profilefile ~/.bashrcyang berarti bahwa alias yang Anda tetapkan ~/.bashrcjuga akan tersedia dalam shell login. Ini tidak benar untuk semua distribusi, jadi Anda mungkin harus mengedit ~/.profilesecara manual untuk mendapatkan sumbernya ~/.bashrc. Perhatikan juga bahwa jika ~/.bash_profileada, ~/.profileakan diabaikan oleh bash.

terdon
sumber
Jadi, apakah Anda menyarankan agar alias didefinisikan dalam alias_profile dan memanggilnya dari .profile atau .bash_profile?
Mehdi
@Mehdi tergantung pada apa yang ingin Anda lakukan. Di sistem Ubuntu Anda, ~/.basyrcsecara otomatis dibaca oleh ~./profile, jadi alias apa pun yang didefinisikan ~/.bashrcjuga akan tersedia untuk setiap pembacaan shell ~/.profile. Yang Anda benar-benar perlu lakukan untuk membuatnya bekerja adalah secara eksplisit memulai shell interaktif ( -i).
terdon
5

Saya harus mengomentari bagian .bashrc saya yang mencegah alias agar tidak digunakan dan menambahkan perintah expand_aliases. Ini dikomentari

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

Dan ini ditambahkan

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

Kemudian perintah saya berhasil:

ssh user@remote_computer -t "my_alias;bash"
Mehdi
sumber