Sudo sebagai pengguna yang berbeda dan layar yang sedang berjalan

167

Mengetahui hari ini bahwa menjalankan layar sebagai pengguna berbeda yang saya sudo tidak akan berfungsi!

yaitu

ssh bob@server         # ssh into server as bob
sudo su "monitor" -
screen                 # fails: Cannot open your terminal '/dev/pts/0'

Saya memiliki skrip yang berjalan sebagai pengguna "monitor". Kami menjalankannya dalam sesi layar untuk melihat output di layar. Masalahnya adalah, kami memiliki sejumlah pengguna yang masuk dengan akun mereka sendiri (yaitu bob, james, susie, dll ...) dan kemudian mereka tiba-tiba masuk ke pengguna "monitor". Memberi mereka akses ke pengguna "monitor" adalah hal yang mustahil.

luckytaxi
sumber
13
Apakah ini kesalahan yang Anda dapatkan? "Tidak dapat membuka terminal Anda '/ dev / pts / 0' - silakan periksa."
Jim
ya itu orangnya. Saya mengerti mengapa itu terjadi tetapi apakah ada solusinya?
luckytaxi
4
Komentar pada perintah Anda - Saya terus melihat orang-orang berjalan sudo su "user" -. Kenapa tidak digunakan sudo -u user -s?
Andrew Aylett
2
@ Jim: +1 untuk memasok pesan kesalahan yang hilang.
Dennis Williamson
1
@Andrew Kebanyakan orang yang saya kenal sudo su- saya pikir hanya orang yang terbiasa (dalam kasus saya itu karena Anda tidak perlu tahu bendera sudo untuk sudo su- Saya tidak berpikir saya pernah membaca halaman sudo :)
voretaq7

Jawaban:

246

Coba jalankan script /dev/nullsebagai pengguna yang Anda suinginkan sebelum meluncurkan layar - ini adalah ghetto hack kecil, tetapi seharusnya membuat layar senang.

voretaq7
sumber
5
Re: implikasi keamanan, tidak ada yang saya sadari (tapi itu tidak berarti tidak ada :) - IIRC ini bergantung pada efek samping dari "skrip" yang membuka perangkat terminal baru (seperti yang diminta oleh pengguna) , dan karena Anda mengirim output skrip ke / dev / null, tidak ada yang perlu ditangkap. Ini juga pasti lebih aman daripada menambahkan pengguna ke grup tty (IMHO)
voretaq7
2
@ sungguh-sungguh Terus terang Anda tidak harus menemukan banyak shell membingungkan jika Anda seorang administrator sistem Unix - yang mengatakan, scriptdapat digunakan untuk memulai screen. Maka Anda hanya perlu keluar dua kali (sekali untuk screen, sekali untuk su). (Ini adalah sesuatu yang scriptdapat diklarifikasi oleh halaman manual untuk Anda, jika Anda meluangkan waktu untuk membacanya ...)
voretaq7
10
Atau lari saja sudo -u bob script -q -c 'screen -dr myscreen' /dev/null. Maka Anda hanya memiliki satu terminal untuk keluar / lepas.
Andy Shulman
4
Terima kasih, ini menyelamatkan saya. Tetapi mengapa ini memperbaikinya? Dari apa yang saya mengerti, itu mencetak semuanya dari stdout ke ... tempat. Dan itu entah bagaimana memperbaiki layar.
sudo
3
@ sudo Untuk melakukan hal itu, scriptbuka perangkat tty sendiri, yang dimiliki oleh pengguna yang menjalankannya (lihat /devdan Anda akan melihatnya muncul setelah Anda menjalankannya script). screenlalu ambil perangkat tty itu (yang dimiliki oleh pengguna yang sedang menjalankan screensehingga tidak kesulitan mengaksesnya). Ini adalah pekerjaan total hack, tetapi berhasil. Melihat beberapa mesin saya, tampaknya layar versi baru tampaknya menginstal setuid-root, yang juga berfungsi, tetapi berarti Anda memiliki biner setuid-root lain yang mengambang, yang membuat beberapa orang merasa tidak nyaman.
voretaq7
33

Saya menggunakan fungsi pembungkus screenuntuk pengguna yang saya gunakan sudo su. Ini adalah fungsi pembungkus yang saya tambahkan ke pengguna ~/.bashrc:

layar fungsi () {
  / usr / bin / script -q -c "/ usr / bin / screen $ {*}" / dev / null
}

Ini memungkinkan saya untuk menggunakan semua opsi dan parameter screenyang mungkin ingin saya gunakan. Saya berpikir untuk menempatkan fungsi ini secara sistem.

steviethecat
sumber
1
Bekerja dengan sempurna. Bagi mereka yang menginginkan seluruh sistem ini, saya sarankan menambahkan ini ke /etc/bash.bashrc - berfungsi di semua pengguna.
Someguy123
2
Ini tidak akan mengutip argumen untuk menyaring dengan benar, jika tidak solusi yang baik.
augurar
7

Dengan asumsi mereka SSHing menjadi tuan rumah, Anda dapat menambahkan kunci ssh publik untuk setiap pengguna yang membutuhkan akses ke akun monitor dalam file ~ monitor / .ssh / official_keys. Kemudian pada mesin remote setiap pengguna mereka dapat menjalankan

ssh -t [email protected] screen -RD

Alex
sumber
Ini adalah pendekatan lain yang baik - Anda harus menentukan perintah paksa dalam file kunci yang diotorisasi (per luckytaxi "memberi mereka akses ke pengguna 'monitor' dari pertanyaan" catatan di atas - perintah yang dipaksakan dapat membatasi mereka hanya untuk hanya melampirkan sesi layar)
voretaq7
2
Saya tidak yakin bagaimana mengatasinya dalam jawaban saya, karena dia berkata "memberi mereka akses ... tidak mungkin", tetapi juga mengatakan "... mereka tiba-tiba menjadi pengguna 'monitor'". Tapi saya setuju, memaksa pembatasan perintah di otor_keys harus mengatasi itu.
Alex
7

Dengan asumsi kita sedang berbicara tentang kesalahan ini:

$ sudo su - bob
$ screen
Cannot open your terminal '/dev/pts/5' - please check.

Berikut ini adalah satu-liner (dapat digunakan sebagai "alias gobob", misalnya):

sudo su - bob -c "script -c bash /dev/null"'

Penjelasan:

Ini akan memulai sebuah shell (seperti shell login) sebagai pengguna bob. Pengguna bob memulai script, yang diperintahkan untuk memanggil bash (bisa berupa tanda hubung atau ksh ...) dan salinan sesi dibuang.

basic6
sumber
0

Mungkin harus mengubah izin pada perangkat yang dimaksud atau menambahkan monitor ke grup yang memiliki izin untuk membaca perangkat itu, itu akan menjadi kecenderungan pertama saya. Tetapi Anda harus mempertimbangkan implikasi keamanan dari melakukannya.

Bart Silverstrim
sumber
0

Anda bilang sudah:

sudo su "monitor" -

Saya bertanya-tanya tentang tanda hubung. Saya biasanya melakukan:

sudo su - username

Tanda hubung (per halaman manual su) memberi tahu su untuk "menjadikan shell sebagai shell login". Ini berarti ia akan sumber semua skrip startup shell yang biasa dan mengatur hal-hal seperti PATH dan HOME dengan benar.

Doug Harris
sumber
3
Nggak. sudo su - usernamedan sudo su username -melakukan hal yang sama.
Tim Ludwinski
-4

Saya baru saja menemukan masalah ini. Selesaikan dengan chmod +rw $(tty)sebelum menjalankan sudo. Masalah dengan solusi ini adalah bahwa siapa pun dapat terhubung dan mengintip terminal Anda setelah itu.

Amos Shapira
sumber
2
Kedengarannya seperti solusi hebat.
Evan Carroll
10
@EvanCarroll Ini adalah solusi hebat, kecuali bagian di mana ia memberi seluruh dunia akses baca & tulis ke terminalnya. Hanya masalah keamanan kecil - Tidak ada program yang peduli tentang itu, kecuali tentu saja apa pun yang memeriksa keamanan terminal sebelum menerima kata sandi ( gpgmisalnya). Dan tentu saja dia tidak akan pernah berada pada sistem dengan pengguna jahat yang akan menonton ttydan mengendus kata sandi ...
voretaq7
Diperingatkan : jangan pernah coba ini di rumah! ini berbahaya!!!
ruizpauker