Jalankan perintah pada komputer lokal dari host SSH jarak jauh yang terhubung?

13

Katakanlah saya telah terhubung ke komputer jarak jauh melalui SSH. Dari program di komputer jarak jauh ini, saya perlu menjalankan perintah di komputer lokal saya (inisiator koneksi).

Yang menimbulkan pertanyaan: apakah mungkin lintah ke koneksi yang ada antara dua komputer untuk menjalankan perintah di komputer lokal?

Saya telah mempertimbangkan menjalankan perintah ssh user@host-of-connecting-party <command>pada komputer jarak jauh untuk membuat koneksi terbalik. Tetapi ini lebih sulit untuk diotomatisasi dan akan membutuhkan intervensi pengguna. Saya berharap saya bisa mengotomatisasi sepenuhnya, atau setidaknya mendeteksi nama pengguna / host dari pengguna yang terhubung.

Aeyoun
sumber
Jelas apa yang ingin Anda lakukan. Yang tidak jelas bagi saya adalah bagian di mana Anda mengatakan "Saya berharap saya bisa mengotomatisasi sepenuhnya, atau setidaknya mendeteksi nama pengguna / host dari pengguna yang terhubung." Apa maksudmu?
hytromo
"lebih sulit untuk diotomatisasi dan akan memerlukan intervensi pengguna" identik dengan "aman" dalam kasus ini. Jika sebuah host jarak jauh dapat menjalankan perintah pada klien yang terhubung, itu akan sangat tidak aman ... bayangkan sebuah server dikompromikan dan siapa pun yang terhubung dengannya hanya mendapatkan mesin lokal mereka terinfeksi ... itu akan menyenangkan :)
Sergey

Jawaban:

5

Terkadang saya memiliki kebutuhan yang sama, selama saya terhubung melalui Putty ke server VPN kami dan dari sana ke ssh ke beberapa host lain, yang tidak dapat dijangkau untuk saya secara langsung karena pengaturan VPN.

Kadang-kadang saya hanya perlu memeriksa sesuatu dengan cepat di mesin server VPN, sambil tetap menjalankan "ssh-session" saya. Salah satu pendekatan adalah menjalankan sesi ssh di bawahscreen , yang, seperti telah saya perhatikan, menambahkan beberapa penundaan dibandingkan dengan "ssh biasa". Pendekatan lain, yang ingin saya bagikan di sini, adalah sebagai berikut:

Saat berada di bawah sesi SSH, Tekan Enter, lalu ~, (pastikan itu tidak ditampilkan, yaitu Anda berada dalam mode perintah), lalu Ctrl- Z. Ini akan menempatkan proses klien ssh di "host" ke latar belakang, dan Anda akan menemukan sesuatu seperti:

[root@client170 ~]# ~^Z [suspend ssh]

[1]+  Stopped                 ssh [email protected]
[root@vps291736 ~]#

Sekarang Anda berada di "host", dapat melakukan apa pun yang Anda inginkan (walaupun, saya tidak yakin berapa lama sesi ssh akan tetap hidup), dan kemudian kembali ke sesi SSH dengan berlari fg.

Setidaknya, ini bekerja untuk saya ketika saya terhubung dari workstation Win10 melalui Putty pada VM berbasis CentOS, dan dari VM yang terhubung melalui SSH ke beberapa host lain.

Semoga ini bisa membantu seseorang!

62mkv
sumber
2
Jika Anda memiliki PermitLocalCommand yesdi Anda .ssh/configuntuk tuan rumah, Anda juga dapat melakukan <Enter>~C, kemudian !<command>.
muru
5

@ 62mkv jawaban adalah solusi yang jauh lebih baik. Gunakan itu.

Namun, untuk kelengkapan dan keingintahuan, jika Anda memiliki server ssh yang berjalan pada mesin lokal Anda, Anda bisa membuat terowongan ssh untuk memungkinkan koneksi ssh dari host jarak jauh pada port 20202 kembali ke lokal pada port 22. Contoh perintah:

ssh -R20202:localhost:22 [email protected]

Ini akan memulai koneksi ssh, tetapi juga mengatur terowongan kembali ke server ssh yang berjalan pada mesin Anda. Maka Anda bisa melakukan ini, ketika ssh'ed ke host jarak jauh:

ssh -p 20202 localuser@localhost

Tentu saja, ini dapat dengan cepat membingungkan - terutama jika teknik ini bersarang lebih dari satu kali. Itu juga menambahkan sedikit latensi - karena semua yang Anda jalankan pada mesin lokal Anda dipantulkan melalui host jarak jauh.

Informasi tambahan tentang ssh tunneling bagi mereka yang keingintahuannya belum terpenuhi dapat ditemukan dalam menjawab pertanyaan unix stackexchange ini .

starbeamrainbowlabs
sumber
Ini jawaban yang sangat bagus. Persis apa yang saya butuhkan untuk dapat melakukan ssh ke mesin jarak jauh yang berada di belakang firewall dan yang dapat diakses melalui teamniewer saja. Saya hanya terhubung melalui teamviewer kemudian dari sesi teamviewer kembali ke mesin saya membuat ssh tunnel dan kemudian saya bisa membuka sesi ssh dari komputer saya ke remote yang saya butuhkan.
Marian
Memang, itu kasus penggunaan yang jauh lebih baik untuk terowongan seperti ini @Marian. Saya melakukan ini sendiri.
starbeamrainbowlabs
0

Jika komputer lokal dan remote Anda dapat diakses dari Internet, Anda bisa membuka sesi SSH dari komputer lokal Anda di komputer jarak jauh, dan kemudian di sesi itu buka sesi ssh lain dari komputer jarak jauh di komputer lokal:

localuser@local> ssh remoteuser@remote
Password:
remoteuser@remote> hostname
remote
remoteuser@remote> ssh localuser@local
Password:
localuser@local> hostname
local
localuser@local> exit
remoteuser@remote> exit
localuser@local>

Untuk mengotomatisasi hal-hal, lihat Fabric (diperlukan pengetahuan Python)

from fabric.api import *

@hosts('host1')
def clean_and_upload():
    local('find assets/ -name "*.DS_Store" -exec rm '{}' \;')
    local('tar czf /tmp/assets.tgz assets/')
    put('/tmp/assets.tgz', '/tmp/assets.tgz')
    with cd('/var/www/myapp/'):
        run('tar xzf /tmp/assets.tgz')
Sergey
sumber
0

Anda dapat menggunakan sshpass untuk menghubungkan ke komputer jarak jauh dan menjalankan perintah.

./sshpass -p "password" ssh user@remoteIP 'bash -s < EOI "Your Commands go here" EOI'

Gunakan skrip shell sederhana di komputer lokal dan gunakan kode di atas setiap kali Anda ingin menjalankan perintah di komputer jarak jauh. Ini adalah salah satu cara saya umumnya digunakan dalam otomasi.

Priyanka
sumber
0

Tidak, Anda tidak dapat membobol sesi yang ada.

Aplikasi Anda akan membutuhkan cara untuk terhubung kembali ke klien. SSH akan berfungsi jika klien memiliki server SSH berjalan dan server dapat mencapai port 22 pada klien. Tidak akan sulit untuk mengotomatisasi jika Anda menggunakan otentikasi berbasis-kunci alih-alih otentikasi kata sandi - dengan cara ini intervensi pengguna tidak diperlukan.

Informasi tentang pengaturan otentikasi berbasis kunci dapat ditemukan di sini: http://tombuntu.com/index.php/2008/02/20/public-key-authentication-for-ssh-made-easy/

Omegamormegil
sumber
0

Jika Anda memiliki akses ke terminal lain, Anda dapat mengirim SIGSTOP menggunakan "kill -19 PID" ke perintah ssh yang memulai koneksinya. Anda kemudian akan mendapatkan kontrol terminal pada terminal di mesin klien. Setelah selesai, Anda dapat memulihkan koneksi ssh hanya dengan mengetik fg untuk membangunkan klien ssh.

Tapi tentu saja pertanyaannya di sini adalah: jika Anda sudah memiliki terminal di mesin klien mengapa Anda melakukan ini :)

Hedi
sumber