none
Передача данных в консольное приложение средствами PowerShell RRS feed

  • Вопрос

  • Добрый день. Будьте солидарны и помогите разобраться с написанием скрипта. 

    Суть скрипта такая:  нужно средствами скрипта удаленно  настроить RealSync на удаленных тачках, ну или хотя бы локально. Просто на 1-й машине нужно настраивать минимум 4 синка, а вручную это мучение сплошное. Поэтому есть идея организовать скрипт, в котором при его запуске необходимо указать логин, пароль. IP и Путь указать в теле самого скрипта и все это закинуть в цикл.

    Пробовал запускать Sync и передать команды, но передается только первая команда и консоль висит на стадии нажатии клавиши Enter. Если нажать вручную Enter то консоль просит ввести IP и так далее

    Пробовал следующее: Invoke-Command -ScriptBlock {"C:\realsync\realsync.exe" -ArgumentList ("C:\base", "192.168.10.5:5643", "vasya", "pass")}

    Start-Process -FilePath "C:\realsync\realsync.exe" -ArgumentList ("C:\base", "192.168.10.5:5643", "vasya", "pass")

    Invoke-Expression -Command "C:\realsync\realsync.exe" "C:\base", "192.168.10.5:5643", "vasya", "pass"

    В общем ничего не получается, просьба помочь или натолкнуть на решение данной проблемы. 

    • Перемещено Vector BCOModerator 2 марта 2017 г. 13:08 Более подходящая ветка
    2 марта 2017 г. 11:12

Ответы

  • 1. Создать шаблоны вручую

    2. Скопировать эти шаблоны на удаленную машину

    При выполнении команды realsync.exe:

    • Создается файл .realsync
    • Если указан пароль,то $env:AppData\.realsync\hash_FolderName

    В моем примере C:\LOG

    ##
    ## dkLab RealSync configuration file.
    ##
    
    # You may load some other config files. It's a good practice to put
    # all user-specific options (e.g. "user" directive, see below) to
    # .realsync-local plus add this file to .gitignore. After that
    # you commit the current .realsync file to your version control
    # system, so developers may just override options in their own local files.
    #load = .realsync-local
    
    # Local directory to be realtime-replicated.
    local = .
    
    # Remote host to replicate to over SSH.
    host = 192.1.1.100:22
    
    # User to connect to the remote host.
    user = test
    
    # Directory at the remote host to replicate files to.
    remote = /test/LOG
    
    # Pathname wildcards to be excluded from the replication.
    # Use "*" for any filename character and "**" for any character,
    # including "/" in pathnames.
    exclude = .realsync
    exclude = CVS
    exclude = .git
    exclude = .svn
    exclude = .hg
    exclude = .cache
    exclude = .idea
    exclude = nbproject
    exclude = ~*
    exclude = *.tmp
    exclude = *.pyc
    exclude = *.swp
    
    # You may read exclusion list from e.g. a .gitignore file.
    #exclude_file = .gitignore
    
    # To turn off "synchronization ding" sound, set the following to 1.
    nosound = 0
    
    # Options passed to RSYNC.
    #rsync_options = -rltzxv --delete --perms=off --chmod=ug=rwX,o=rX
    
    # Options passed to SSH.
    #ssh_options = -o Compression=yes -o CompressionLevel=9 -o ConnectTimeout=3 -o ServerAliveInterval=2 -o ServerAliveCountMax=4 -o StrictHostKeyChecking=no

    Как формируется hash - https://github.com/DmitryKoterov/dklab_realsync/blob/master/realsync

    sub build_pathes_based_on_cwd {
        my ($is_tmp) = @_;
        my $dir_appdata = ($ENV{APPDATA} || $ENV{HOME}) or die "Environment variable HOME must be set!\n";
        # First, try to use legacy scheme.
        build_pathes_based_on_cwd_legacy($dir_appdata, $is_tmp);
        return if -f $FILE_CONFIG;
        # Use a new scheme.
        my $cwd = getcwd();
        my $hash = $cwd;
        $hash =~ s{^\w:[/\\]|[/\\]+$}{}sg;
        $hash =~ s{\W+}{_}sgi;
        $hash = substr($hash, -80) if length($hash) > 80;
        $hash = substr(md5_hex($cwd), 0, 10) . "_" . $hash;
        # Build pathes.
        $DIR_PRIVATE = $dir_appdata . "/$REALSYNC_SPEC_FILE/" . $hash;
        $DIR_PRIVATE .= ".tmp" if $is_tmp;
        $FILE_IDENTITY = "$DIR_PRIVATE/.ssh/identity";
        $FILE_CONFIG = "$cwd/$REALSYNC_SPEC_FILE";
    }

    Т.е. если пароль не меняется, то можно копировать ключи в папку Hash_Name, для генерации можно использовать perl, который в дистрибутиве или PowerShell.

    PS (STA) > dir $env:appdata\.realsync\ -Name
    69db20ce5b_LOG

    Сформировать hash в PowerShell:

    PS (STA) > -join ([Security.Cryptography.HashAlgorithm]::Create("MD5").ComputeHash([System.Text.Encoding]::UTF8.GetBytes("C:/LOG"))|%{ $_.ToString("x2") } | select -f 5)
    69db20ce5b

    Для теста скопируем LOG в PLOG и сделаем синхронизацию:

    copy C:\Log\ -destination C:\PLOG\ -Recurse
    (gc C:\PLOG\.realsync) -replace "remote = .+","remote = /root/PLOG" | Out-File C:\PLOG\.realsync -Encoding utf8
    $hash = -join ([Security.Cryptography.HashAlgorithm]::Create("MD5").ComputeHash([System.Text.Encoding]::UTF8.GetBytes("C:/PLOG"))|%{ $_.ToString("x2") } | select -f 5)
    md "$env:appdata\.realsync\${hash}_PLOG"
    copy "$env:appdata\.realsync\${hash}_LOG\*" -destination "$env:appdata\.realsync\${hash}_PLOG\" -Recurse
    
    PS (STA) > .\realsync.exe C:\PLOG
    dkLab RealSync: replicate developer's files over SSH in realtime.
    
    [11:10:16] Running async notification watcher (to save CPU time).
    [11:10:17] Initiating a background connection with /root/PLOG...
    [11:10:17] Fast initial rsync synchronization...
    sending incremental file list
    ./
    PS. Или обратиться к сообществу perl/автору проекта и изменить скрипт,чтобы принимал параметры realsync.pl ,а не запрашивал их вручную для генерации конфигов .



    • Изменено KazunEditor 3 марта 2017 г. 8:26
    • Помечено в качестве ответа SmolMax 6 марта 2017 г. 16:00
    3 марта 2017 г. 8:10
    Отвечающий
  • Здесь не форум по *nix системам. 

    1. Сгенерировать ключ
    $FILE_IDENTITY = "$env:AppData\.realsync\Hash_FolderName\.ssh\identity"
    ssh-keygen -N -q -t rsa -b 2048 -f $FILE_IDENTITY
    
    2. Копировать ключ на удаленную систему для пользователя (~/.ssh)
    $h_port = 22
    $h_host = "10.10.10.10"
    $user = "test"
    $key = Get-Content "$FILE_IDENTITY.pub"
    ssh -o StrictHostKeyChecking=no -p"$h_port" "$user@$h_host" "cd; umask 077; test -d .ssh && chmod 700 .ssh || mkdir .ssh; test -e .ssh/authorized_keys && chmod 600 .ssh/authorized_keys; $key >> .ssh/authorized_keys" 
    Для автоматизации работы ssh с паролем, собрать проект sshpass - https://github.com/Edgar0119/cygwin-sshpass

    • Помечено в качестве ответа SmolMax 6 марта 2017 г. 16:00
    4 марта 2017 г. 15:22
    Отвечающий

Все ответы

  • В скриптовую ветку тебе, барин, надо.
    2 марта 2017 г. 12:33
  • В скриптовую ветку тебе, барин, надо.

    Done

    The opinion expressed by me is not an official position of Microsoft

    2 марта 2017 г. 13:09
    Модератор
  • 1. Создать шаблоны вручую

    2. Скопировать эти шаблоны на удаленную машину

    При выполнении команды realsync.exe:

    • Создается файл .realsync
    • Если указан пароль,то $env:AppData\.realsync\hash_FolderName

    В моем примере C:\LOG

    ##
    ## dkLab RealSync configuration file.
    ##
    
    # You may load some other config files. It's a good practice to put
    # all user-specific options (e.g. "user" directive, see below) to
    # .realsync-local plus add this file to .gitignore. After that
    # you commit the current .realsync file to your version control
    # system, so developers may just override options in their own local files.
    #load = .realsync-local
    
    # Local directory to be realtime-replicated.
    local = .
    
    # Remote host to replicate to over SSH.
    host = 192.1.1.100:22
    
    # User to connect to the remote host.
    user = test
    
    # Directory at the remote host to replicate files to.
    remote = /test/LOG
    
    # Pathname wildcards to be excluded from the replication.
    # Use "*" for any filename character and "**" for any character,
    # including "/" in pathnames.
    exclude = .realsync
    exclude = CVS
    exclude = .git
    exclude = .svn
    exclude = .hg
    exclude = .cache
    exclude = .idea
    exclude = nbproject
    exclude = ~*
    exclude = *.tmp
    exclude = *.pyc
    exclude = *.swp
    
    # You may read exclusion list from e.g. a .gitignore file.
    #exclude_file = .gitignore
    
    # To turn off "synchronization ding" sound, set the following to 1.
    nosound = 0
    
    # Options passed to RSYNC.
    #rsync_options = -rltzxv --delete --perms=off --chmod=ug=rwX,o=rX
    
    # Options passed to SSH.
    #ssh_options = -o Compression=yes -o CompressionLevel=9 -o ConnectTimeout=3 -o ServerAliveInterval=2 -o ServerAliveCountMax=4 -o StrictHostKeyChecking=no

    Как формируется hash - https://github.com/DmitryKoterov/dklab_realsync/blob/master/realsync

    sub build_pathes_based_on_cwd {
        my ($is_tmp) = @_;
        my $dir_appdata = ($ENV{APPDATA} || $ENV{HOME}) or die "Environment variable HOME must be set!\n";
        # First, try to use legacy scheme.
        build_pathes_based_on_cwd_legacy($dir_appdata, $is_tmp);
        return if -f $FILE_CONFIG;
        # Use a new scheme.
        my $cwd = getcwd();
        my $hash = $cwd;
        $hash =~ s{^\w:[/\\]|[/\\]+$}{}sg;
        $hash =~ s{\W+}{_}sgi;
        $hash = substr($hash, -80) if length($hash) > 80;
        $hash = substr(md5_hex($cwd), 0, 10) . "_" . $hash;
        # Build pathes.
        $DIR_PRIVATE = $dir_appdata . "/$REALSYNC_SPEC_FILE/" . $hash;
        $DIR_PRIVATE .= ".tmp" if $is_tmp;
        $FILE_IDENTITY = "$DIR_PRIVATE/.ssh/identity";
        $FILE_CONFIG = "$cwd/$REALSYNC_SPEC_FILE";
    }

    Т.е. если пароль не меняется, то можно копировать ключи в папку Hash_Name, для генерации можно использовать perl, который в дистрибутиве или PowerShell.

    PS (STA) > dir $env:appdata\.realsync\ -Name
    69db20ce5b_LOG

    Сформировать hash в PowerShell:

    PS (STA) > -join ([Security.Cryptography.HashAlgorithm]::Create("MD5").ComputeHash([System.Text.Encoding]::UTF8.GetBytes("C:/LOG"))|%{ $_.ToString("x2") } | select -f 5)
    69db20ce5b

    Для теста скопируем LOG в PLOG и сделаем синхронизацию:

    copy C:\Log\ -destination C:\PLOG\ -Recurse
    (gc C:\PLOG\.realsync) -replace "remote = .+","remote = /root/PLOG" | Out-File C:\PLOG\.realsync -Encoding utf8
    $hash = -join ([Security.Cryptography.HashAlgorithm]::Create("MD5").ComputeHash([System.Text.Encoding]::UTF8.GetBytes("C:/PLOG"))|%{ $_.ToString("x2") } | select -f 5)
    md "$env:appdata\.realsync\${hash}_PLOG"
    copy "$env:appdata\.realsync\${hash}_LOG\*" -destination "$env:appdata\.realsync\${hash}_PLOG\" -Recurse
    
    PS (STA) > .\realsync.exe C:\PLOG
    dkLab RealSync: replicate developer's files over SSH in realtime.
    
    [11:10:16] Running async notification watcher (to save CPU time).
    [11:10:17] Initiating a background connection with /root/PLOG...
    [11:10:17] Fast initial rsync synchronization...
    sending incremental file list
    ./
    PS. Или обратиться к сообществу perl/автору проекта и изменить скрипт,чтобы принимал параметры realsync.pl ,а не запрашивал их вручную для генерации конфигов .



    • Изменено KazunEditor 3 марта 2017 г. 8:26
    • Помечено в качестве ответа SmolMax 6 марта 2017 г. 16:00
    3 марта 2017 г. 8:10
    Отвечающий
  • Спасибо за ответ, натолкнули на некоторые мысли. Про логику работы правильно сказали, лучше готовые конфиги и ключи раскидывать. Осталось придумать как генерировать SSH ключи и отправить их на сервер, т.к. логин и пароль на всех ПК разный.

    Может быть есть мысли как генерировать ключ автоматом и отправлять на сервер?

    Домой приду, по пробую сам что придумать, но если вы что предложите, было бы круто. Спасибо ))))

    3 марта 2017 г. 14:51
  • Здесь не форум по *nix системам. 

    1. Сгенерировать ключ
    $FILE_IDENTITY = "$env:AppData\.realsync\Hash_FolderName\.ssh\identity"
    ssh-keygen -N -q -t rsa -b 2048 -f $FILE_IDENTITY
    
    2. Копировать ключ на удаленную систему для пользователя (~/.ssh)
    $h_port = 22
    $h_host = "10.10.10.10"
    $user = "test"
    $key = Get-Content "$FILE_IDENTITY.pub"
    ssh -o StrictHostKeyChecking=no -p"$h_port" "$user@$h_host" "cd; umask 077; test -d .ssh && chmod 700 .ssh || mkdir .ssh; test -e .ssh/authorized_keys && chmod 600 .ssh/authorized_keys; $key >> .ssh/authorized_keys" 
    Для автоматизации работы ssh с паролем, собрать проект sshpass - https://github.com/Edgar0119/cygwin-sshpass

    • Помечено в качестве ответа SmolMax 6 марта 2017 г. 16:00
    4 марта 2017 г. 15:22
    Отвечающий
  • Спасибо большое, все получилось как и хотел, правда по мучился немного, но все работает ))) 

    Есть еще один вопрос, может поможете. Как в групповых политиках WinServ 2012 R2 разрешить выполнение только определенных скриптов, т.е. только скриптов написанных мной, а все сторонние запретить, будь то они подписанные или нет.

    Буду очень благодарен. Спасибо.
    10 марта 2017 г. 11:15
  • Спасибо большое, все получилось как и хотел, правда по мучился немного, но все работает ))) 

    Есть еще один вопрос, может поможете. Как в групповых политиках WinServ 2012 R2 разрешить выполнение только определенных скриптов, т.е. только скриптов написанных мной, а все сторонние запретить, будь то они подписанные или нет.

    Буду очень благодарен. Спасибо.
    Задайте новый вопрос

    The opinion expressed by me is not an official position of Microsoft

    10 марта 2017 г. 11:18
    Модератор