Solusi 1:
Anda dapat menggunakan awk untuk mengekstrak pengguna/grup dengan ID 500 atau lebih. Saya juga mengambil kebebasan untuk mengecualikan id pengguna 65534, yang sering dicadangkan untuk pengguna "bukan siapa-siapa" (bergantung pada distro; tidak ada petunjuk jika CentOS melakukannya):
awk -F: '($3>=500) && ($3!=65534)' /etc/passwd > passwd.new
awk -F: '($3>=500) && ($3!=65534)' /etc/group > group.new
awk -F: '($3>=500) && ($3!=65534) {print $1}' /etc/passwd | grep -f - /etc/shadow > shadow.new
Kemudian gunakan rsync, scp, atau metode transmisi file pilihan Anda untuk menyalin file ke sistem cadangan Anda. File-file ini kemudian dapat ditambahkan ke akhir file passwd, grup atau bayangan 'bersih' ketika Anda perlu memulihkannya (yaitu:hanya pengguna/grup sistem default, untuk mencegah duplikasi ID/nama pengguna yang tidak disengaja).
cat passwd.new >> /etc/passwd
cat group.new >> /etc/group
cat shadow.new >> /etc/shadow
Solusi 2:
NIS/NIS+ diciptakan untuk alasan yang tepat ini.
Tapi otentikasi mereka agak jelek dan terpusat (LDAP/Kerberos/SMB/dll.) adalah ide yang jauh lebih baik jika Anda bisa melakukannya. Untuk mengatur NIS/NIS+ Anda memerlukan:
Paket:
yp-tools ypbind ypserv portmap
dan /etc/yp.conf dengan sesuatu seperti:
domain example.org server nis.example.org
ypserver nis.example.org
dan kemudian di /etc/sysconfig/network:
NISDOMAIN=example.org
Dan saya malas, inilah cara yang bagus:http://www.wains.be/index.php/2007/02/28/setting-up-nis-under-centos-4/ yang akan memandu Anda melewatinya.
Secara pribadi untuk pencadangan, saya baru saja mencadangkan seluruh direktori /etc/ dan menyelesaikannya. Paling banyak hanya beberapa MB.
Solusi 3:
gunakan cppw dan cpgr:
CPPW(8)
NAME
cppw, cpgr - copy with locking the given file to the
password or group file
SYNOPSIS<br>
cppw [-h] [-s] password_file
cpgr [-h] [-s] group_file
DESCRIPTION
cppw and cpgr will copy, with locking, the given file to
/etc/passwd and /etc/group, respectively. With the -s flag,
they will copy the shadow versions of those files,
/etc/shadow and /etc/gshadow, respectively.
With the -h flag, the commands display a short help message
and exit silently.
SEE ALSO
vipw(8), vigr(8), group(5), passwd(5), shadow(5), gshadow(5)
AUTHOR
cppw and cpgr were written by Stephen Frost, based on vipw
and vigr written by Guy Maor.
Solusi 4:
Ada banyak cara dan solusi di sini, tetapi untuk menjawab pertanyaan awal ada tiga langkah:
-
Buat kunci SSH tanpa kata sandi di server:
ssh-keygen -b 4096
-
Salin .ssh/id_rsa.pub ke .ssh/authorized__keys2 di klien:
scp ~/.ssh/id_rsa.pub client:.ssh/authorized_keys2
-
Tambahkan sesuatu seperti ini ke /etc/crontab Anda (atau edit dengan crontab -e):
0 0 * * * scp /etc/{passwd,shadow,group} [email protected]:/var/mybackupdir
Solusi 5:
Yah, saya pikir ada sesuatu yang bisa saya gunakan tanpa harus menggulirkan solusi saya sendiri, tetapi saya harus melakukan sesuatu dengan cepat.
Di bawah ini adalah skrip yang akan melakukan apa yang saya butuhkan.
Petunjuk
Agar berfungsi, cukup ubah beberapa variabel konfigurasi agar UID minimum dan maksimum dianggap sebagai normal pengguna dan nama host jarak jauh atau alamat IP.
Anda harus menyiapkan server jarak jauh untuk menerima sesi SSH yang masuk dari root
server lokal pengguna tanpa harus memasukkan kata sandi.
Komandan Keen mengisyaratkan bagaimana hal itu dilakukan dalam jawabannya di halaman ini, tetapi Anda juga dapat merujuk ke login SSH tanpa kata sandi untuk petunjuk mendetail.
Cara kerjanya
Yang dilakukan skrip adalah menyalin setiap passwd jarak jauh , grup , bayangan , bayangan file dari server jarak jauh ke lokasi sementara di server lcoal.
Kemudian menghapus file temp ini dari semua pengguna "normal", hanya menyimpan referensi ke pengguna sistem.
Langkah selanjutnya adalah menelusuri setiap passwd versi lokal , grup , bayangan , bayangan dan hanya menambahkan pengguna "normal" ke file temp yang sesuai, lalu mengunggah masing-masing kembali ke server jarak jauh untuk menggantikan yang lama.
Peringatan
Sebelum mencoba apa pun, pastikan Anda membuat salinan passwd Anda , grup , bayangan , bayangan di server lokal dan jarak jauh.
Keamanan
Kepemilikan dan atribut file dipertahankan.
File sementara disimpan di /tmp
dan dihapus, apakah sinkronisasi berhasil atau tidak.
Server lokal harus memiliki root
tanpa kata sandi akses ke cadangan (tetapi bukan sebaliknya). Ini diperlukan agar kami bisa mendapatkan file konfigurasi akun pengguna (yang jika tidak dibatasi).
Kode
Ini adalah upaya pertama dan agak berantakan (bukan kode yang bagus) tetapi berfungsi dengan baik dan orang lain mungkin menganggapnya berguna.
Ini adalah skrip Perl yang hanya bergantung pada Net::SCP
modul untuk menyalin file dengan aman antar server.
#!/usr/bin/perl -w
use Net::SCP qw(scp);
use strict;
use constant TRUE => (1==1);
use constant FALSE => (1==0);
#--------------------------------------------------------
# Configuration
# Modify as needed
#--------------------------------------------------------
my $remoteHost = '10.13.113.2'; # email backup server
my $minUID = 500;
my $maxUID = 30000;
my $minGID = 500;
my $maxGID = 30000;
#--------------------------------------------------------
# Internal variables, normally not to be modified.
#--------------------------------------------------------
my $systemConfigDir = '/etc';
my $tmpDir = $ENV{TMPDIR} || $ENV{TMP} || $ENV{TEMP} || '/tmp';
#--------------------------------------------------------
# Main
#--------------------------------------------------------
# STEP 1
# Get the remote files to /tmp and
# clean them of their normal users
ProcessFiles('remote');
# STEP 2
# Append the local normal users to the temp files
# and then send them back to the remote
ProcessFiles('local');
#--------------------------------------------------------
# ProcessFiles sub does one of two things:
# - if the passed argument is 'remote', then fetch each
# user account file from the remote server, then remove
# all normal users from each file, only keeping the
# system users.
# - if the passed argument is 'local', then appends all
# normal local users to the previously fetched and
# cleaned-up files, then copies them back to the remote.
#--------------------------------------------------------
sub ProcessFiles {
my $which = shift;
my $tmpfile;
my %username = ();
my %usergroup = ();
my %userUID = ();
my %userGID = ();
my @info;
foreach my $f ('passwd','group','shadow','gshadow') {
my $tmpfile = "$tmpDir/$f.REMOTE";
if ($which eq 'remote') {
# Fetch the remote file
unlink $tmpfile if -e $tmpfile;
scp("$remoteHost:$systemConfigDir/$f", $tmpfile)
or die ("Could not get '$f' from '$remoteHost'");
}
# Glob the file content
open CONFIGFILE, (($which eq 'remote') ? $tmpfile : "$systemConfigDir/$f");
my @lines = <CONFIGFILE>;
close CONFIGFILE;
# Open the temp file, either truncating it or in append mode
open TMPFILE, (($which eq 'remote') ? ">$tmpfile" : ">>$tmpfile" )
or die "Could not open '$tmpfile' for processing";
foreach my $line (@lines) {
# Skip comments, although they should be illegal in these files
next if $f =~ /^\s*#/;
@info = (split ':', $line);
if ($f eq 'passwd') {
my $uid = $info[2];
my $isnormaluser = ($uid > $minUID) && ($uid < $maxUID);
next if (($which eq 'remote') ? $isnormaluser : !$isnormaluser);
$username{$info[0]} = TRUE;
$userUID{$uid} = TRUE;
$userGID{$info[3]} = TRUE;
} elsif ($f eq 'group') {
my $gid = $info[2];
my $isnormalgroup = ($gid > $minGID) && ($gid < $maxGID);
next if (($which eq 'remote') ? $isnormalgroup : !$isnormalgroup);
$usergroup{$info[0]} = TRUE;
} elsif ($f eq 'shadow') {
next if !exists $username{$info[0]};
} else {
next if !exists $usergroup{$info[0]};
}
# Any line that reaches this point is valid
print TMPFILE $line;
}
close TMPFILE;
if ($which eq 'local') {
# send the file back
scp($tmpfile, "$remoteHost:$systemConfigDir/$f") or
die ("Could not send '$f' to '$remoteHost'");
unlink $tmpfile;
}
}
}
#--------------------------------------------------------
# Make sure we cleanup the temp files when we exit
#--------------------------------------------------------
END {
my $tmpfile;
foreach my $f ('passwd','group','shadow','gshadow') {
$tmpfile = "$tmpDir/$f.REMOTE";
unlink $tmpfile if -e $tmpfile;
}
}
Perbarui 21MAY2010:kode yang diperbarui untuk meningkatkan sinkronisasi ID grup