Altere a permissão da pasta baseada em list.txt

1

Eu tenho 3 pastas enormes contendo muitas outras pastas que eu preciso dar acesso a terceiros para download via SFTP.

No momento, todas as pastas no diretório principal estão configuradas para direitos de download do SFTP, então minha idéia é criar um list.txt contendo os arquivos que o usuário não pode acessar e definir as permissões para algo? Ou mova esses arquivos para outra pasta?

A pasta em questão terá mais de 2000 pastas contendo milhões de arquivos acima de 500 GB e eu preciso remover o acesso a metade deles

Exemplo de lista de pastas

(1) some test (2) more test

1. PLANT Madrid Two

2013 Folio ltd

2014-27

201-07-98

3M

3M 4M 5M

3M Comp LTD

5028 - Video

6398SRTTGDS

Eu estava pensando em algo como um script bash que até moveria os arquivos para uma nova pasta ou alteraria as permissões. Quaisquer pensamentos sobre o que seria melhor com a quantidade de dados, pastas e usuários serão usados pelo SFTP para baixar as outras pastas?

while IFS= read -r dir; do
  mv -t path/to/Deny_folder -R -- "$dir"
done < list.txt

ou

while IFS= read -r dir; do
  chown 700 "$dir"
done < list.txt
    
por Grimlockz 14.03.2017 / 12:42

2 respostas

1

Você pode evitar o loop bash lento com algo assim, o que parece funcionar bem em meus testes:

$ tr '\n' '
cat file1 |xargs -d'\n' -I{} echo "mv -vt path/to/deny " {}
' <file1 |xargs -0 -I{} mv -vt path/to/deny {} #v for verbose. #OR $ cat file1 |xargs -d'\n' -I{} mv -vit path/to/deny {} # set delimiter to new line

Para uma corrida seca, você pode fazer um teste como este

$ while IFS= read -r dir; do folders+=("$dir");done < list.txt
$ mv -t path/to/Deny_folder -- "${folders[@]}"  #-R is not available in Red Hat and Debian

PS: Meu comando mv no RHEL & Debian não reconhece a opção -R em mv.

Uma armadilha dessa solução é se os nomes de diretório em seu arquivo incluírem novas linhas como parte de seu dirname. Em todos os outros casos (ou seja, nomes de dir com espaços), ambas as versões foram testadas e funcionam bem.

Se você quiser fazer isso com um loop, você pode acelerar as coisas evitando chamar o mv para cada linha lida pelo seu arquivo. Você poderia "carregar" todas as linhas / diretórios em uma matriz e chamar mv depois, como:

while IFS= read -r dir; do 
let "a++"
folders+=("$dir")
[ "$a" -gt 1000 ] && mv -vt path/to/Deny_folder -- "${folders[@]}" && a=1 && unset folders 
done < list.txt

Ou até mesmo fazer um tipo de agrupamento mv:

$ tr '\n' '
cat file1 |xargs -d'\n' -I{} echo "mv -vt path/to/deny " {}
' <file1 |xargs -0 -I{} mv -vt path/to/deny {} #v for verbose. #OR $ cat file1 |xargs -d'\n' -I{} mv -vit path/to/deny {} # set delimiter to new line
    
por 14.03.2017 / 16:07
0

Nota: Eu testaria o seguinte em uma pequena pasta de exemplo antes de modificar seu diretório de 500GB. Além disso, eu faria um backup do diretório antes de alterá-lo. Mesmo sendo 500 GB, ter o backup é inestimável.

tar -zcvf mybackup.tar.gz big_ol_directory

Então eu mudaria o tar.gz, talvez apenas para a sua máquina local, ou para outra máquina na rede, qualquer outra máquina. Dois backups no mesmo local não são tão úteis.

No que diz respeito às permissões, gosto da sua ideia de permissões. Outra ideia é usar permissões de grupo para limitar o acesso.

# ensure that no one has access except the owner (root, your user, whatever)
chmod -R 600 big_ol_directory

# alternatively
# chown -R myuser:companygroup big_ol_directory
# chmod -R 660 big_ol_directory

# create a group and add a user:
# https://www.howtogeek.com/50787/add-a-user-to-a-group-or-second-group-on-linux/

# begin granting access to ftpusers 
chown -R root:ftpusers big_ol_directory

# use 770, 760, 740 as desired (g+rw is x6x)
chmod -R g+rw big_ol_directory/public

# files in the root of big_ol_directory, including directories
# other than public, will still be owner-editable only.
    
por 14.03.2017 / 16:54