coloca o arquivo mais antigo em log.txt no smbclient

0

Temos 94 PCs em 1 site. Existe uma pasta que precisamos verificar o arquivo mais antigo nessa pasta em cada PC.

Eu posso executar um arquivo .txt com todos os IPs em um loop, mas não sei como verificar e obter o arquivo mais antigo e adicioná-los em um log.txt. Preciso do nome desse arquivo nesse log.

while read line; do

IP=$(echo $line | cut -d ';' -f 2)
NAME=$(echo $line | cut -d ';' -f 1)

smbclient  '\'$IP'\C$' -W *** -U ***%*** -c "cd \*****\*****; get TheOldestFile" >> log.txt 

É possível fazer isso com o smbclient?

    
por Dylanbeginner21 08.03.2018 / 15:32

1 resposta

0

Dado que o conjunto de comandos smbclient não implementa um shell completo, minha melhor idéia (curta de estocar os compartilhamentos e usar os utilitários de shell locais) é "analisar ls".

Em um nível alto, você poderia substituir o comando single smbclient por dois:

  1. smbclient ... dir - para obter a listagem de arquivos
  2. smbclient ... get - para obter o arquivo mais antigo

Como não tenho um ambiente semelhante ao seu, aqui estão as "entranhas" do que eu substituiria:

filename=$(smbclient '\'$IP'\C$' -W *** -U ***%*** -c "cd \*****\*****; dir" | awk -f parse-smbclient-ls)
smbclient '\'$IP'\C$' -W *** -U ***%*** -c "cd \*****\*****; get $filename"

Onde o conteúdo de parse-smbclient-ls seria:

BEGIN {
  "date +%s" | getline oldesttime
}

/ N / {
  #                      size           thu             mar             dd              dd:dd:dd                                dddd
  if (match($0, / N +[[:digit:]]+ +[[:alpha:]]{3} [[:alpha:]]{3} +[[:digit:]]+ [[:digit:]]{2}:[[:digit:]]{2}:[[:digit:]]{2} [[:digit:]]{4}$/)) {
    timestamp=sprintf("%s %s %s %s %s", $(NF-4), $(NF-3), $(NF-2), $(NF-1), $NF)
    filename=substr($0, 3, RSTART-3)
    # trim trailing whitespace -- *** hope the real filename doesn't end in whitespace
    sub(/ +$/, "", filename);
    ("date --date='"timestamp"' +%s") | getline seconds
    if (seconds < oldesttime) {
        oldesttime=seconds
        oldestfile=filename
    }
  }
}

END {
  print oldestfile
}

Percorrendo o script do awk:

  1. inicializa o valor da data mais antiga atualmente para a hora atual; espero que o arquivo mais antigo tenha pelo menos um segundo de idade
  2. Se a linha corresponder a / N / , pareceremos estar olhando para um arquivo normal (versus diretório)
  3. se a linha corresponder à expressão regular fornecida (o que tenta ter o cuidado de corresponder apenas ao N, tamanho em bytes e carimbo de data / hora, seguido do final da linha $ ), então
  4. extrair o registro de data e hora
  5. extrair o nome do arquivo
  6. delimitar o espaço em branco no nome do arquivo
  7. solicite a data do GNU para converter o registro de data e hora do arquivo em segundos
  8. se o arquivo atual for mais antigo do que o que temos, salve o registro de data e hora e o nome do arquivo
  9. no final, imprima o nome de arquivo mais antigo

Observe que isso tem pelo menos dois problemas que eu conheço:

  1. se o nome real do arquivo terminar em espaço em branco (como é perfeitamente legal, mesmo no Windows, acredito), então esse processo falhará duas maneiras - o script awk corta o espaço em branco e o comando A substituição também tira o espaço em branco.
  2. arquivos que contêm (algum tipo de) caracteres especiais são renomeados; por exemplo, quando criei um arquivo chamado foo$'\n'bar , o comando smbclient dir me mostrou: FKCEWC~I como o nome do arquivo.
por 08.03.2018 / 19:43

Tags