Saya memiliki server Ubuntu yang saya hubungkan menggunakan SSH.
Saya perlu mengunggah file dari komputer saya ke /var/www/
dalam server, file-file /var/www/
itu dimiliki oleh root
.
Menggunakan Putty, setelah saya login, saya harus mengetik sudo su
dan kata sandi saya terlebih dahulu agar dapat memodifikasi file /var/www/
.
Tetapi ketika saya menyalin file menggunakan WinSCP, saya tidak dapat membuat / memodifikasi file di /var/www/
, karena pengguna saya terhubung dengan tidak memiliki izin pada file di /var/www/
dan saya tidak bisa mengatakan sudo su
seperti yang saya lakukan dalam kasus sesi ssh .
Apakah Anda tahu bagaimana saya bisa menangani ini?
Jika saya sedang mengerjakan mesin lokal saya, saya akan menelepon gksudo nautilus
tetapi dalam kasus ini saya hanya memiliki akses terminal ke mesin.
Jawaban:
Anda benar, tidak ada
sudo
saat bekerja denganscp
. Solusinya adalah menggunakanscp
untuk mengunggah file ke direktori di mana pengguna Anda memiliki izin untuk membuat file, kemudian masuk melalui ssh dan gunakansudo
untuk memindahkan / menyalin file ke tujuan akhir mereka.Solusi lain adalah mengubah izin / kepemilikan direktori tempat Anda mengunggah file, sehingga pengguna yang tidak memiliki hak istimewa dapat menulis ke direktori tersebut.
Secara umum, bekerja di
root
akun harus menjadi pengecualian, bukan aturan - cara Anda mengutarakan pertanyaan Anda membuat saya berpikir mungkin Anda sedikit melecehkannya, yang pada gilirannya menyebabkan masalah dengan izin - dalam keadaan normal Anda tidak perlu hak super admin untuk mengakses file Anda sendiri.Secara teknis, Anda dapat mengonfigurasi Ubuntu untuk memungkinkan login jarak jauh secara langsung
root
, tetapi fitur ini dinonaktifkan karena suatu alasan, jadi saya sangat menyarankan Anda untuk tidak melakukannya.sumber
scp -R mysite [email protected]:/home/dimitris/
2.ssh [email protected]
3.sudo mv ~/mysite /var/www
- ini adalah proses 2 langkah, pertama Andascp
file ke dir rumah Anda, kemudian Anda login melalui ssh dan salin / pindahkan file ke tempat mereka seharusnyaMetode lain adalah menyalin menggunakan tar + ssh daripada scp:
sumber
sudo: sorry, you must have a tty to run sudo
. Jika saya menambahkan "-t" untuk mengalokasikan TTY maka saya dapatPseudo-terminal will not be allocated because stdin is not a terminal.
. Saya tidak dapat melihat ini berfungsi tanpa sudo tanpa kata sandi.ssh -t [email protected] "sudo tar -x --no-same-owner -C /var/www"
sudo tar
, arsipkan, ubah izin menggunakanchmod
danchown
, lalu salin ke lokal. Apalagi kalau itu direktori.Cara cepat
Dari server ke mesin lokal:
Dari mesin lokal ke server:
sumber
Anda juga dapat menggunakannya
ansible
untuk mencapai ini.Salin ke host jarak jauh menggunakan modul ansible
copy
:Ambil dari host jarak jauh menggunakan modul ansible
fetch
:CATATAN:
-i HOST,
sintaksis bukan kesalahan ketik. Ini adalah cara untuk menggunakan ansible tanpa memerlukan file inventaris.-b
menyebabkan tindakan pada server dilakukan sebagai root.-b
meluas ke--become
, dan default--become-user
adalah root, dengan default--become-method
adalah sudo.flat=yes
hanya menyalin file, tidak menyalin seluruh jalur jauh yang mengarah ke filecopy
modul, tetapi tidak olehfetch
modul.Doa Khusus untuk Pertanyaan ini
Berikut ini adalah contoh yang spesifik dan sepenuhnya ditentukan, dengan asumsi direktori pada host lokal Anda yang berisi file yang akan didistribusikan
sourcedir
, dan nama host target remote adalahhostname
:Dengan doa singkat:
PS, saya menyadari bahwa mengatakan "cukup instal alat yang luar biasa ini" adalah semacam nada-tuli. Tapi saya merasa sangat berguna untuk mengelola server jarak jauh, jadi menginstalnya pasti akan membawa Anda manfaat lain di luar penggunaan file.
sumber
ansible -i "hostname," all -u user --become -m copy -a ...
-i 'host,'
sintaks yang valid? Saya pikir mudah untuk kehilangan tanda baca seperti itu ketika membaca sebuah perintah. (Untuk pembaca yang saya maksud, jika bukan kulitnya.)-i 'host,'
dan sama dengan-i host,
atau-i "host,"
. Secara umum saya lebih suka untuk menjaga doa ini sesingkat mungkin untuk menjaga mereka dari menjadi menakutkan, tetapi Anda harus merasa bebas untuk membuatnya sebagai kata kerja dan eksplisit karena Anda pikir diperlukan untuk kejelasan.Ketika Anda menjalankan
sudo su
, semua file yang Anda buat akan dimiliki oleh root, tetapi tidak mungkin secara default untuk langsung login sebagai root dengan ssh atau scp. Juga tidak mungkin menggunakan sudo dengan scp, sehingga file tidak dapat digunakan. Perbaiki ini dengan mengklaim kepemilikan atas file Anda:Dengan asumsi nama pengguna Anda adalah dimitri, Anda dapat menggunakan perintah ini.
Sejak saat itu, sebagaimana disebutkan dalam jawaban lain, cara "Ubuntu" adalah menggunakan sudo, dan bukan login root. Ini adalah paradigma yang bermanfaat, dengan keuntungan keamanan yang luar biasa.
sumber
sudo chow ...
untuk setiap direktori tunggal: S-R
dichown
mengatakan untuk mengubah kepemilikan direktori itu, dan semua file anak-anak dan direktori secara rekursif ... sehingga Anda dapat melakukan apa pun yang Anda suka.Mungkin cara terbaik adalah menggunakan
rsync
( Cygwin / cwRsync di Windows) melalui SSH?Misalnya, untuk mengunggah file dengan pemilik
www-data
:Dalam kasus Anda, jika Anda membutuhkan root privilege, perintahnya akan seperti ini:
Lihat: scp ke server jauh dengan sudo .
sumber
Jika Anda menggunakan alat OpenSSH alih-alih Putty, Anda dapat melakukannya dengan memulai
scp
transfer file pada serversudo
. Pastikan Anda memilikisshd
daemon yang berjalan di mesin lokal Anda. Denganssh -R
Anda dapat memberikan server cara untuk menghubungi mesin Anda.Di mesin Anda:
Selain masuk Anda di server, ini akan meneruskan setiap koneksi yang dibuat pada port server 11111 ke port mesin Anda 22: port yang
sshd
sedang Anda dengarkan.Di server, mulai transfer file seperti ini:
sumber
Anda dapat menggunakan skrip yang saya tulis terinspirasi oleh topik ini:
tetapi ini membutuhkan beberapa hal gila (yang merupakan btw. secara otomatis dilakukan oleh skrip)
Ini dia skripnya:
sumber
Anda dapat menggabungkan ssh, sudo dan mis tar untuk mentransfer file antar server tanpa bisa login sebagai root dan tidak memiliki izin untuk mengakses file dengan pengguna Anda. Ini sedikit fiddly, jadi saya sudah menulis skrip untuk membantu ini. Anda dapat menemukan skrip di sini: https://github.com/sigmunau/sudoscp
atau di sini:
sumber
Berikut adalah versi modifikasi dari jawaban Willie Wheeler yang mentransfer file melalui tar tetapi juga mendukung pemberian kata sandi ke sudo pada host jarak jauh.
Sedikit sihir ekstra di sini adalah opsi -S untuk sudo. Dari halaman manual sudo:
Sekarang kita benar-benar ingin output tar untuk disalurkan ke ssh dan yang mengarahkan kembali stdin ssh ke stdout tar, menghapus cara apa pun untuk memasukkan kata sandi ke sudo dari terminal interaktif. (Kita bisa menggunakan fitur ASKPASS sudo pada ujung jarak jauh tetapi itu adalah cerita lain.) Namun kita dapat memasukkan kata sandi ke sudo dengan menangkapnya terlebih dahulu dan menambahkannya ke output tar dengan melakukan operasi-operasi dalam subkulit dan menyalurkan output dari subshell menjadi ssh. Ini juga memiliki keuntungan tambahan karena tidak meninggalkan variabel lingkungan yang berisi kata sandi kami menggantung di shell interaktif kami.
Anda akan melihat saya tidak menjalankan 'baca' dengan opsi -p untuk mencetak prompt. Ini karena prompt kata sandi dari sudo dengan mudah diteruskan kembali ke stderr shell interaktif kami melalui ssh. Anda mungkin bertanya-tanya "bagaimana eksekusi sudo mengingat itu berjalan di dalam ssh di sebelah kanan pipa kami?" Ketika kita menjalankan banyak perintah dan menyalurkan output dari satu ke yang lain, shell induk (shell interaktif dalam kasus ini) mengeksekusi setiap perintah dalam urutan segera setelah mengeksekusi sebelumnya. Karena setiap perintah di belakang pipa dieksekusi, shell induk menempel (mengarahkan) stdout sisi kiri ke stdin sisi kanan. Output kemudian menjadi input saat melewati proses.
Shell interaktif kami adalah PID 7168, subshell kami adalah PID 7969 dan proses ssh kami adalah PID 7970.
Satu-satunya kelemahan adalah bahwa membaca akan menerima input sebelum sudo punya waktu untuk mengirimkan kembali prompt itu. Pada koneksi cepat dan host jarak jauh cepat Anda tidak akan melihat ini tetapi Anda mungkin jika salah satu lambat. Penundaan apa pun tidak akan memengaruhi kemampuan untuk memasukkan prompt; mungkin saja muncul setelah Anda mulai mengetik.
Catatan saya hanya menambahkan entri file host untuk "remote_Host" ke mesin lokal saya untuk demo.
sumber