.Bashrc kaynağını oluşturduktan sonra ssh ile etkileşimli bir kabukta komut çalıştırın


11

Uzak bir Ubuntu bilgisayara ssh yapmak, kaynak yapmak .bashrcve bunun tarafından ayarlanan parametrelere bağlı bir komutu çalıştırmak istiyorum .bashrc. Tüm bunlar, komut tamamlandıktan sonra kapanmayan etkileşimli bir kabukta.

Şimdiye kadar denediğim şey

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

ya da sadece

ssh user@remote_computer -t "my_alias;bash"

Bu genel komutlar için ( lsörneğin gibi ) çalışır, ancak içinde tanımlanan bir diğer adı çalıştırmayı denediğimde .bashrcbir hata alıyorum:

bash: my_alias: command not found

Ama sonra tekrar elle yazıp çalıştırdığımda işe yarıyor!

Peki .bashrc, komut çağrılmadan önce kodun kaynaklandığından nasıl emin olabilirim ?


Gönderi kafa karıştırıcı. Bunun gibi çalışan komutları kötüye kullanmamanızı öneririm; yine de bash veya bash komutu çağrılıyorsa, .bashrc komutunun çalıştırılması gerekiyor. Açıkçası böyle bir komut çalıştırmanın bazı farklılıkları veya özellikleri vardır ve daha ciddi uygulamalar için Ansible veya kukla öneririm.
Rui F Ribeiro

Sorumu düzenledim. İkinci komut daha basittir ve aynısını yapar, ancak yine de .bashrc kaynağını kullanmadan.
Mehdi

@RuiFRibeiro Kötüye Kullanım ?? nasıl böyle basit bir şey kötüye diyebilirsiniz ?? ssh ile uzaktaki bir makineye giriş yaptıktan sonra otomatik olarak bir komut çalıştırmak, bu kadar basit. Bu kadar gülünç derecede küçük bir görev için konuşlandırılacak herhangi bir harici araç aşırıya kaçar
Mehdi

1
Sadece bir konuşma figürü, daha geniş bir terimde kullanılmak üzere tasarlanmamıştı. İhtiyacınız olduğunda kullanın, ancak kullanmak göründüğü kadar huzurlu değildir. Bununla birlikte, gelecekteki referanslar için Ansible'a bir göz atın, aslında ne kadar hafif olduğuna şaşıracaksınız. Sık sık komutları ssh ile de çalıştırıyorum.
Rui F Ribeiro

Yanıtlar:


9

Sorun, etkileşimli olmayan bir kabukta bir diğer ad çalıştırmaya çalışmanızdır. Eğer çalıştırdığınızda ssh user@computer command, commandolmayan etkileşimli olarak çalıştırılır.

Etkileşimli olmayan mermiler takma adları okumaz (man bash'tan):

Expand_aliases shell seçeneği shopt kullanılarak ayarlanmadığı sürece, kabuk etkileşimli olmadığında takma adlar genişletilmez (aşağıdaki SHELL BUILTIN COMMANDS altındaki shopt açıklamasına bakın).

Son bashkomut takma adlarınız artık kullanılabilir olduğundan etkileşimli bir kabuk başlattığından , el ile yeniden çalıştırırsanız çalışır .

Alternatif olarak, takma adınızı çalıştırmak için uzak makinede bash -ibasit bir oturum açma kabuğu ( bash -l) yerine etkileşimli bir kabuk ( ) başlatabilirsiniz :

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

Bu çok karmaşık bir yaklaşım gibi görünüyor. Bunu tam olarak neden yapmanız gerektiğini açıklamadınız, ancak şu alternatifleri göz önünde bulundurun:

  1. Uzak makinede normal bir giriş etkileşimli kabuğu başlatın ve komutu manuel olarak çalıştırın:

    user@local $ ssh user@remote
    user@remote $ my_alias
  2. Bu bilgisayara bağlandığınızda diğer adın her zaman çalışmasını istiyorsanız , uzak bilgisayarın ~/.profile(veya ~/.bash_profilevarsa) düzenleyin ve bu satırı sonuna ekleyin:

    my_alias

    Çünkü ~/.profilebir oturum açma kabuğu her başlatıldığında okunur ( sshörneğin , her bağlandığınızda ), bu my_aliasher bağlandığınızda çalışmasına neden olur .

    Varsayılan olarak, giriş kabuklarının okundu ~/.profileveya ~/.bash_profileyoksayıldığını unutmayın ~/.bashrc. Ubuntu gibi bazı dağıtımlar (Debian ve türevleri ve Arch) dağıtımları varsayılan ~/.profileveya ~/.bash_profiledosya kaynaklarına ~/.bashrcsahiptir, yani tanımlanmış takma adlarınız ~/.bashrcbir giriş kabuğunda da kullanılabilir. Bu, tüm dağıtımlar için geçerli değildir, bu nedenle ~/.profilekaynağınız olması için manuel olarak düzenlemeniz gerekebilir ~/.bashrc. Ayrıca eğer dikkat ~/.bash_profilevar, ~/.profilebash tarafından göz ardı edilecektir.


Diğer adın takma ad_profilinde tanımlanmasını ve .profile veya .bash_profile dosyasından çağrılmasını önerir misiniz?
Mehdi

@Mehdi ne yapmak istediğinize bağlı. Ubuntu sisteminizde, ~/.basyrcotomatik olarak tarafından okunur ~./profile, bu nedenle tanımlanan tüm takma adlar ~/.bashrcokunan kabuklar tarafından da kullanılabilir ~/.profile. Bunu işe almak için gerçekten yapmanız gereken tek şey etkileşimli bir kabuk ( -i) başlatmaktı .
terdon

5

Takma adların kullanılmasını engelleyen bir .bashrc bölümümün yorumunu yapmak ve bir expand_aliases komutu eklemek zorunda kaldım. Bu yorum yapıldı

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

Ve bu eklendi

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

Sonra komutum çalıştı:

ssh user@remote_computer -t "my_alias;bash"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.