scp ke server jauh dengan sudo

65

Saya punya file di server A (yang ada di belakang NAT jadi tidak langsung dialamatkan). File perlu disalin ke server B dalam direktori yang terbatas pada root. Saya memiliki akun di server B dengan hak sudo. Apa sintaks untuk perintah scp?

Neil
sumber
Saya telah menutup pertanyaan yang lebih lama sebagai duplikat dari pertanyaan ini, karena penanya tidak pernah mendapatkan kembali kepemilikan atas pertanyaan itu.
quack quixote
Saya telah menjawab pada postingan lain bagaimana Anda dapat menyesuaikan scp melakukan sudo untuk Anda secara langsung. Ini mirip dengan apa yang dilakukan WinSCP.
YoYo

Jawaban:

58

Pertama, Anda perlu menyalin file ke tempat di mana Anda memiliki akses tulis tanpa sudo,

scp yourfile serverb:

Kemudian pindahkan file menggunakan sudo

ssh serverb sudo mv yourfile /path/to/the/destination

Jika Anda tidak memiliki tempat yang bisa ditulisi, buat direktori sementara dengan izin menulis untuk pengguna Anda.

ssh serverb sudo mkdir tempdir && sudo chmod 777 tempdir
scp yourfile serverb:tempdir
ssh serverb mv tempdir/yourfile /path/to/the/destination
Johan
sumber
7
/ tmp adalah tempat yang baik untuk menulis file sementara yang (biasanya) semua pengguna memiliki akses.
Doug Harris
3
@ Doug: Perhatikan bahwa / tmp bisa dalam RAM atau di / titik pemasangan, dan tidak harus cukup besar untuk meng-host file besar.
Ravachol
2
Apa pun yang Anda coba capai, chmod 777biasanya cara yang salah untuk melakukannya. Pertimbangkan apa yang bisa terjadi jika orang lain masuk dan tahu Anda akan menjalankan kode ini.
tripleee
1
ssh sudotidak bekerja untuk saya - mengeluh "tidak ada tty sekarang dan tidak ada program askpass yang ditentukan"?
Ross Presser
1
@RossPresser maaf atas jawaban yang terlambat, tetapi Anda harus mengatur sudo tanpa kata sandi aktif serverbatau Anda perlu ssh serverbsecara terpisah, kemudian jalankan sudo ...setelah login.
Johan
49

Dengan SCP, Anda harus melakukannya dalam dua langkah, namun, Anda dapat melakukannya bersamaan dengan rsync sebagai berikut:

rsync --rsync-path="sudo rsync" <LOCALFILE> USER@SERVER2:/root

Catatan: Ini memang membutuhkan NOPASSWDkonfigurasi sudo. Jika Anda harus memasukkan kata sandi untuk sudo, maka diperlukan dua langkah.

Untuk menyalin direktori, Anda perlu menambahkan -rparameter. Dan -vuntuk keluaran verbose.


Untuk menggunakan metode di atas dengan kredensial, Anda perlu menambahkannya ke ~/.ssh/configfile Anda , mis

Host SERVER2
  HostName server2.example.colm
  User USER
  #IdentityFile ~/.ssh/custom_key.pem
MasterCheffinator
sumber
5
Sejauh ini, ini adalah cara paling sederhana untuk melakukannya.
Matt White
Kesalahan sudo: sorry, you must have a tty to run sudodiperbaiki oleh -e "ssh -tt".
mj41
@ mj41 Dengan -e "ssh -tt", saya mengerti protocol version mismatch -- is your shell clean?. Adakah petunjuk tentang cara memperbaikinya?
kapak.
19

Anda dapat menggunakan ssh dan tar untuk mengatasi ini:

ssh -t host 'sudo -v'
ssh -C host 'cd /; sudo tar cf - path/to/file/or/dir' | tar xpsf - --preserve

Ini pertama kali memperbarui stempel waktu sudo Anda (meminta kata sandi jika perlu, yang memerlukan tty ( ssh -t)), dan kemudian menggunakan sudo untuk membuat tarball dari jarak jauh dan mengekstraknya secara lokal.

"tar" pada RedHat 5 membutuhkan opsi "--preserve" untuk muncul setelah perintah "xpsf -".

kebiru-biruan
sumber
Hanya sebuah catatan: jika Anda mendapatkan tar: Invalid replacement string, menghapus -stampaknya untuk memperbaikinya (tidak yakin apa yang Anda butuhkan suntuk itu). Terimakasih banyak; ini luar biasa.
RecursivelyIronic
Ini tty_ticketsharus dinonaktifkan, benar?
Jacob Budin
@ JacobBudin ya.
blueyed
4

Anda dapat menggunakan sftp dengan perintah sudo, misalnya:

sftp -s 'sudo -u REMOTE_SUDO_USER /usr/libexec/openssh/sftp-server' REMOTE_USER@HOST
DaniloNC
sumber
Ini dan metode rsync mungkin merupakan cara paling langsung untuk melakukannya dalam satu langkah. Sangat disayangkan bahwa tugas scp dalam semut tidak mendukungnya. Anda dapat mengaturnya untuk menggunakan sftp, tetapi Anda tidak dapat memodifikasi sub-program jarak jauh. Perhatikan bahwa sub-program akan berbeda tergantung pada jenis server (solaris mungkin berbeda).
YoYo
0

Jika Anda perlu mengetikkan kata sandi untuk sudo setiap saat, Anda dapat menyimpannya ke file:

echo "Enter password: "; read -s password; echo $password > password_file

dan kemudian mengirimkannya bersama dengan file sumber.

cat password_file source_file | ssh remote_host 'sudo -S sponge target_file'

Anda dapat menggunakan teedaripada spongejika Anda tidak memiliki lebih banyak util.

Jan Tojnar
sumber
0

Pertama, Anda perlu menyalin file ke tempat di mana Anda memiliki akses tulis tanpa sudo, Anda dapat melakukan dua langkah berikut.

Langkah 1: scp filename newserver

Langkah 2: ssh newserver sudo mv filename /path/to/the/destination

untuk informasi lebih lanjut baca tutorial scp

Mike Tyson
sumber
-1
current server $ sudo scp username@server:source/path/filename /tmp/

Ini akan menyalin file tertentu dari sumber ke / tmp / di server saat ini

Kumar
sumber
Ini akan mengeksekusi sudo secara lokal, tidak memberi Anda hak yang lebih tinggi dari jarak jauh.
YoYo
Ini tidak akan berhasil, seperti yang dikatakan @Yoyo.
Mani
scp mungkin tidak akan terhubung, karena akan membaca kunci root
Pierre-Olivier Vares