Автор Тема: Повтаряща се оторизация с rsync и ssh  (Прочетена 4216 пъти)

Naka

  • Напреднали
  • *****
  • Публикации: 3395
    • Профил
Имам баш скрипт, който ъплоудва определини скриптове и данни на сървер.

#!/bin/bash
......

rsync -av --rsh="/usr/bin/ssh -x" ............ user@example.com
.....
rsync ..........
.....
ssh user@example.com ...mv ....
......



Въпросът е, че не е само една команда rsync а няколко и един ssh. При стартиране на скрипта при първия rsync ме пита за парола.

Как мога да направя така, че да ме пита за парола само първият път, а последващите rsync и ssh да ползват вече установената оторизация или запомнената парола. Сървера и юзера е един и същ.



« Последна редакция: Sep 01, 2016, 10:44 от Naka »
Активен

Perl - the only language that looks the same before and after encryption.

pennywise

  • Гост
Re: Повтаряща се оторизация с rsync и ssh
« Отговор #1 -: Sep 01, 2016, 12:53 »
Може би ще ти е по-лесно и сигурно да използваш ключове, така няма да се налага да имаш пароли в чист текст в скриптовете.
Активен

neter

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 3408
  • Distribution: Debian, SailfishOS, CentOS
  • Window Manager: LXDE, Lipstick
    • Профил
    • WWW
Re: Повтаряща се оторизация с rsync и ssh
« Отговор #2 -: Sep 04, 2016, 22:09 »
+1 за ключове. Има и варианти, с които можеш да използваш парола, като машинно подаване на данни с expect (в момента нямам време да ти дам конкретен пример, но сме давали примери тук, а има достатъчно и в Мрежата) или подаване на парола към ssh с sshpass или друг инструмент, но при наличието на автентикация с ключове, това са излишни (в някои случаи и вредни) глупости.
Активен

"Да си добре приспособен към болно общество не е признак за добро здраве" - Джиду Кришнамурти

Naka

  • Напреднали
  • *****
  • Публикации: 3395
    • Профил
Re: Повтаряща се оторизация с rsync и ssh
« Отговор #3 -: Oct 04, 2016, 18:29 »
Добре пробвах с ключове и става. Досега не бях се занимавал с тях.
направих го така:

ssh-keygen (генерира свойка ключове)
ssh-copy-id -i naka@example.com    (това копира публичният ключ на сървера example.com в .ssh/authorized_keys)

ssh naka@example.com   (и влиза без парола)


Добре но мен ми трябва поне един път в началото на скрипта да попита за някаква парола? Иначе всеки един ще може да стартира скрипта. А и аз може да го пусна без да искам - и като няма какво да ме спре за оторизация.....
Стигам до извода че вместо 'парола' трябва да се използва паролата за достъп до частният ключ и ключовете генерирани с ssh-keygen да ги направя с парола. Тогава  паролата за използването на секретният ключ да е и паролата за скрипта: ???

това измислих:
демончето ssh-agent си работи постоянно почти във всеки линукс. Той е нещо като контейнер на ключове.

#!/bin/bash

ssh-add   (пита един път за парола на частният ключ и го добавя за облужване от ssh-agent )

ssh naka@example.com   (влиза без парола, като си комуникира с  ssh-agent-а)
ssh naka@example.com   (влиза без парола, като си комуникира с  ssh-agent-а)
....
ssh-add -d     (чисти частният ключ от ssh-agent)
...


Пропускам ли нещо?






« Последна редакция: Oct 04, 2016, 18:50 от Naka »
Активен

Perl - the only language that looks the same before and after encryption.

kierenski

  • Напреднали
  • *****
  • Публикации: 92
    • Профил
Re: Повтаряща се оторизация с rsync и ssh
« Отговор #4 -: Oct 04, 2016, 18:55 »
Напиши си скрипт с променливи, има много описания как се чете ред от баш и се записва в променлива(ето и пример):
read -r pwd

като прочетеното от един ред ще се запише в променлива $pwd и после си я пускаш по-нататака за обработка като параметър за парола където е необходима.

п.п. само не забравяй че накрая трябва да изчистиш променливата иначе всеки ще може да ползва скрпита докато не се рестартира компа.
« Последна редакция: Oct 04, 2016, 19:08 от kierenski »
Активен

4096bits

  • Напреднали
  • *****
  • Публикации: 6152
    • Профил
Re: Повтаряща се оторизация с rsync и ssh
« Отговор #5 -: Oct 04, 2016, 22:12 »
Ключове. Трябваше още когато пишеш скрипта да се сетиш, че не е добра идея в прав текст някъде да присъстват потребител и парола.
Пък е и по-лесно.
Активен

As they say in Mexico, "Dasvidaniya!" Down there, that's two vidaniyas.

Naka

  • Напреднали
  • *****
  • Публикации: 3395
    • Профил
Re: Повтаряща се оторизация с rsync и ssh
« Отговор #6 -: Oct 05, 2016, 10:50 »
То ако в началото на скрипта чета парола  и я съхранявам в променлива не ми върши никаква работа, щото ssh, scp  ... нямат опция за подаване на парола - нарочно. ssh има опция за подаване само на юзер ssh  [-l login_name]
« Последна редакция: Oct 05, 2016, 12:27 от Naka »
Активен

Perl - the only language that looks the same before and after encryption.

kierenski

  • Напреднали
  • *****
  • Публикации: 92
    • Профил
Re: Повтаряща се оторизация с rsync и ssh
« Отговор #7 -: Oct 05, 2016, 12:20 »
То ако в началото на скрипта чета парола  и я съхранявам в променлива не ми върши никаква работа, щото ssh, scp  ... нямат опция за подаване на параола - нарочно. ssh има опция за подаване само на юзер ssh  [-l login_name]

Вместо парола можеш да задаваш ключ или пък да посочиш файл с ключ или парола все тая(това си е променлива).
Всичко опира до малко фантазия и разбиране как работи баш скрипт.
Активен

Naka

  • Напреднали
  • *****
  • Публикации: 3395
    • Профил
Re: Повтаряща се оторизация с rsync и ssh
« Отговор #8 -: Oct 26, 2016, 15:42 »
Направих го с ключове и заработи идеално. Благодаря на всички за идеиите.
За протокола това е работещият патън:

Код
GeSHi (Bash):
  1. #!/bin/bash
  2.  
  3. # Начин на Генериране на Ключове:
  4. ########################################################################################################################################
  5. # 1. ssh-keygen задава се парола за частният ключ и се създава двата ключа:)
  6. # ~/.ssh/id_rsa.pub        (публичен)
  7. # ~/.ssh/id_rsa (частен с парола или без)
  8. #
  9. # 2. ssh-copy-id -i user@example.com копира публичният ключ (~/.ssh/id_rsa.pub) на сървера example.com
  10. #     във файла /home/user/.ssh/authorized_keys и задава правилните пермишъни на файла authorized_keys
  11. # във файла authorized_keys може да има и други ключове.
  12. # Вместо тази команда това може да се направи и на ръка през ssh, scp.
  13. ########################################################################################################################################
  14.  
  15.  
  16. # унищожава промеливите на обкръжението/връзката към евентуален стартиран от системата ssh-agent
  17. # Така както е направено в началото тези променливи да бъдат премахнати, едно бъдещо извикване на die(),
  18. # преди да е било стартирано ssh-agent, няма да предизвика ниакакво убиване на ssh-agent защото няма променлива.
  19. unset SSH_AUTH_SOCK SSH_AGENT_PID
  20.  
  21. # SIGINT: ctrl+c;   SIGTERM: kill 1234;   SIGHUP: close win;
  22. trap "die 'Script aborted.'" SIGHUP SIGINT SIGTERM
  23.  
  24.  
  25.  
  26. function die(){
  27. # Убива текущият агент. Иначе ако не се убие, може да е имало успешно стартиран от предните редове и ssh-agent-а ще остане
  28. # работещ. В резулта на много стартирания и прекъсваня на скрита - например с ctrl+c, ще останат много работещи демони в системата.
  29. # може и направо без проверка с eval `ssh-agent -k`  но  така изхода от скрипта става по четлив/лаконичен -
  30. # няма да има съобщение "kill: No such process" ако die() е извикан само за изход на скрипта и преди да има има стартиран ssh-agent
  31. # ако ли пък има стартиран ssh-agent ще излезе нормалното му съобщение за убиване на pid
  32. #
  33. # ! задължително в началото на този скрипт трябва да има unset SSH_AUTH_SOCK SSH_AGENT_PID
  34. # иначе може да убие системният ssh-agent, защото ще види enviorment променливата SSH_AGENT_PID предадена от родителя.
  35.  
  36. # -n True if the length of "STRING" is non-zero.
  37. [ -n "$SSH_AGENT_PID" ] && eval `ssh-agent -k`
  38.  
  39. echo -e "$1"
  40. exit 1
  41. }
  42.  
  43.  
  44. # проверка дали частният ключ е защитен с парола или дали избощо го има.
  45. # grep излиза с 0 когато има съвпадение и с 1, когато няма или с 2 когато има грешка.
  46. grep --silent --no-messages ENCRYPTED ~/.ssh/id_rsa || die "\nThe private key ~/.ssh/id_rsa does NOT have password or does not exit. Script aborted. Nothing done."
  47.  
  48. # ssh-agent служи като контейнер на key-овете. През него си комуникират ssh, rsync.....
  49. #
  50. # линукса при стартирането си има стартиран един ssh-agent, но за да е независимо от системата а и за да оказва влияние
  51. # само на този скрипт се стартира отделен (допълнителен) ssh-agent демон. този демон задава променливите
  52. # SSH_AUTH_SOCK, SSH_AGENT_PID, които сочат само към него и чрез тях ssh-add, ssh, rsync си комуникират с него.
  53. #
  54. # Ако се стартира ssh-agent-а без eval, ssh-agent се стартира, демонизира се и изписва в станадартния изход следният текст:
  55. # SSH_AUTH_SOCK=/tmp/ssh-CtCAWu6104/agent.1234; export SSH_AUTH_SOCK;
  56. # SSH_AGENT_PID=1234; export SSH_AGENT_PID;
  57. # Но понеже това е само изписано в стандартният изход, никакви променливи не се задават и се губи връзката с демона!
  58. # Затова стартирането става през eval `ssh-agent` за да може да се зададат/изпълнят променливите.
  59.  
  60. eval `ssh-agent`
  61.  
  62. # !!! Тук скрипта спира да пита за парола !!!
  63. #
  64. # Зарежда частният ключ ~/.ssh/id_rsa в ssh-agent-а
  65. # Ако частният ключ е с парола пита интерактивно за паролата на ключа. След като един път ключа е добавен в ssh-agent-а
  66. # повече не се пита за никаква парола!
  67.  
  68. # излиза с 1 error при:
  69. # 1 - липса на ключ ~/.ssh/id_rsa
  70. # 1 - натискане на enter при въвеждане на парола. Това е правилно защото key-а има парола а юзера все едно казва неща да въвеждам парола
  71.  
  72. ssh-add || die "\nssh-add exit. Script aborted. Nothing done."
  73.  
  74. echo -ne "\n\n"
  75. echo -ne "-------------------------------------------\n"
  76. echo -ne "Main files update.\n"
  77. echo -ne "-------------------------------------------\n"
  78.  
  79. # отдалеченият ssh се стартира с опция малко -x, --rsh="/usr/bin/ssh -x" която забранява X оторизацията.
  80. # тази опция е козметична и не фатална, досега беше без нея.
  81. #
  82. # Ако не е зададена всеки път при стартиране на скрипта ssh-а ще прави файл .Xauthority в отдалечената
  83. # home директория и ще излиза съобщение:
  84. # "/usr/bin/xauth:  creating new authority file ~/.Xauthority"
  85.  
  86. # -a === -rlptgoD  --recursive,--links,--perms,--times,--group,--owner,--devices
  87.  
  88.  
  89.  
  90.  
  91. rsync -av --rsh="/usr/bin/ssh -x" .......................... || die "\nRsync error. Script aborted. Not all jobs done."
  92.  
  93. rsync -av --rsh="/usr/bin/ssh -x" .......................... || die "\nRsync error. Script aborted. Not all jobs done."
  94.  
  95. rsync -av --rsh="/usr/bin/ssh -x" .......................... || die "\nRsync error. Script aborted. Not all jobs done."
  96.  
  97. rsync -av --rsh="/usr/bin/ssh -x" .......................... || die "\nRsync error. Script aborted. Not all jobs done."
  98.  
  99.  
  100.  
  101.  
  102.  
  103. echo -ne "\n\n"
  104. # търка ключовете. Може и без тази стъпка, защото при долната, когато се убива агента ще се изтрият и ключовете.
  105. ssh-add -d
  106. # Убива текущият агент
  107. eval `ssh-agent -k`
  108.  
  109. echo -ne "-------------------------------------------\n"
  110. echo -ne "The script executed successfully. All done.\n"
  111. echo -ne "-------------------------------------------\n"
  112. echo -ne "\n"
  113.  


PS: rsync има една неподозирана/скрита функция. rsync може да преименува файлове на отдалеченият компютър - може да ги ъплоудне под друго име на сървера, но само ако се работи с единични файлове.
Например:

Код:
rsync local_file_name.txt  hello@example.com:/home/hello/different_name.txt

т.е. соурса и таргета са реални файлове/не директории. в случая обаче ремуте директорията /home/hello/ трябва да е предварително създадена.
« Последна редакция: Oct 26, 2016, 16:08 от Naka »
Активен

Perl - the only language that looks the same before and after encryption.

runtime

  • Напреднали
  • *****
  • Публикации: 807
  • Distribution: Ubuntu 14.04
  • Window Manager: Unity
  • LZ1DOT
    • Профил
    • WWW
Re: Повтаряща се оторизация с rsync и ssh
« Отговор #9 -: Oct 26, 2016, 19:53 »
А ако не е създадена, то не може ли с --relative /newdir/ да си я създаде?
Активен

Подобни теми
Заглавие Започната от Отговора Прегледи Последна публикация
rsync
Настройка на програми
zmei 3 2360 Последна публикация Mar 02, 2005, 11:10
от rpetrov
Rsync и кирилски имена на файловете
Хардуерни и софтуерни проблеми
morbid_viper 3 3107 Последна публикация Sep 10, 2009, 13:02
от mx
Грешка с rsync
Хардуерни и софтуерни проблеми
chatter 1 2180 Последна публикация Dec 22, 2007, 20:50
от chatter
rsync главоблъсканица ...
Настройка на програми
sash 2 1832 Последна публикация Jan 29, 2012, 00:39
от sash
rsync въпрос
Настройка на програми
amarth 1 1207 Последна публикация Feb 25, 2013, 17:27
от Georgy