Завал и на работе и дома.
Пока второй день прут эмоции.
twisted - жжот!!!!
Пока второй день прут эмоции.
twisted - жжот!!!!
Вокруг веб разработки
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$rLogin = trim($_POST['rLogin']);
$rPass = trim($_POST['rPass']);
$rPass2 = trim($_POST['rPass2']);
$rEmail = trim($_POST['rEmail']);
if ($rLogin == '') {
die("Поле 'Логин' не заполнено\n");
// Логин может состоять из букв, цифр и подчеркивания
}elseif (!preg_match("/^\w{3,}$/", $rLogin)) {
die("В поле 'Логин' введены недопустимые символы\n");
}
if ($rEmail == '') {
die("Поле 'E-mail' не заполнено\n");
// Проверяем e-mail на корректность
}elseif (!preg_match("/^[a-zA-Z0-9_\.\-]+@([a-zA-Z0-9\-]+\.)+[a-zA-Z]{2,6}$/", $rEmail)) {
die("Указанный 'E-mail' имеет недопустимый формат\n");
}
if ($rPass == '' || $rPass2 == '') {
die("Поле 'Пароль' не заполнено\n");
}elseif($rPass !== $rPass2) {
die("Поля 'Пароль' и 'Повтор пароля' не совпадают\n");
// Пароль может состоять из букв, цифр и подчеркивания
}elseif(!preg_match("/^\w{3,}$/", $rPass)) {
die("В поле 'Пароль' введены недопустимые символы\n");
}
// В базе данных у нас будет храниться md5-хеш пароля
$mdPassword = md5($rPass);
// А также временная метка (зачем - позже)
$time = time();
// Устанавливаем соединение с бд(не забудьте подставить ваши значения сервер-логин-пароль)
$link = mysql_connect('localhost', $dbuser, $dbpass);
if (!$link) {
die("Не могу соединиться с базой данных");
}else {
// Выбираем базу данных
mysql_select_db('authorize', $link);
// Записываем в базу (не используем addslashes - экранировать нечего)
mysql_query("INSERT INTO users (login, pass, email, timestamp)
VALUES ('$rLogin','$mdPassword','$rEmail',$time)",$link);
if (mysql_error($link) != "") {
die("Пользователь с таким логином уже существует, выберите другой\n");
}
echo "Юзер добавлен\n";
mysql_close($link);
}
}
?>
class DbException extends Exception {};
if ($_SERVER['REQUEST_METHOD'] != 'POST')
{
try
{
foreach ( array('rLogin' => 'Логин' , 'rPass' => 'Пароль' , 'rPass2' => 'Повторный пароль', 'rEmail' => 'E-mail' ) as $val => $fieldName)
{
if ( isset($_POST[$val] ) )
$val = trim($_POST[$val]); //create rLogin, rPass, rPass2, rEmail variables
else
throw new Exception("Поле $fieldName не заполнено\n");
}
if (!preg_match("/^\w{3,}$/", $rLogin))
throw new Exception("В поле 'Логин' введены недопустимые символы\n");
if (!preg_match("/^[a-zA-Z0-9_\.\-]+@([a-zA-Z0-9\-]+\.)+[a-zA-Z]{2,6}$/", $rEmail))
throw new Exception("В поле 'Логин' введены недопустимые символы\n");
if($rPass !== $rPass2)
throw new Exception("Поля 'Пароль' и 'Повтор пароля' не совпадаютn");
if(!preg_match("/^\w{3,}$/", $rPass))
throw new Exception("В поле 'Пароль' введены недопустимые символы\n");
$mdPassword = md5($rPass);
// А также временная метка (зачем - позже)
$time = time();
// Устанавливаем соединение с бд(не забудьте подставить ваши значения сервер-логин-пароль)
$link = mysql_connect('localhost', $dbuser, $dbpass);
if (!$link)
throw new DbException("Не могу соединиться с базой данных");
// Выбираем базу данных
mysql_select_db('authorize', $link);
// Записываем в базу (не используем addslashes - экранировать нечего)
mysql_query("INSERT INTO users (login, pass, email, timestamp) VALUES ('$rLogin','$mdPassword','$rEmail',$time)",$link);// поле timestamp можно сделать чтобы по умолчанию подставлялось базой, такие вещи лучше перекладывать на базу.
if (mysql_error($link) != "")
DbException("Пользователь с таким логином уже существует, выберите другой\n");
echo "Юзер добавлен\n";
mysql_close($link);
}
catch (DbException $e)
{
die("DB ERROR: " . $e->getMEssage());
}
catch ( Exception $e)
{
die( "Form validation error: ". $e->getMessage());
}
}
?>
В итоге.
pcd@cd-laptop:~$ php -a
php > error_reporting(E_ALL);// устанавливаем уровень ошибок,
php > $ar = array(); // создаем массив
php > var_dump($ar[1]); // обращаемся к несуществующему индексу
Notice: Undefined offset: 1 in php shell code on line 1//логично
NULL
php > $null = null;// создаем переменну инициализированную нулом
php > var_dump($null[1]);// обращаемся к нему как к массиву
NULL// ошибки нет, это уже не совсем логично, т.к.
php > var_dump( (array) $null ) ; // при преобразовании нула в массив
array(0) {
}// получается пустой массив без индекса 1.
//ну хотя можно как то объяснить, т.к. null это особый тип.
php > $false = false;// boolean переменная, инициализированная ложью
php > var_dump($false[1]);// обращение как к массиву при этом к несуществующиему индексу
NULL// а как объяснить это????
php > var_dump((array)$false);// смотрим как ложь приводится к массиву.
array(1) {
[0]=>
bool(false)
}// этого я не ожидал
// но тогда получается что ...
php > echo (array) false ? 'true' : 'false';
true // ну а это просто п***ц, сколько человек могло попасть так!
cd@cd-laptop:~$ cat ex1.php
class ExampleDb
{
/**
* This function return list of users as array,
* empty array on failure
*/
public function findAll($testValue = true)
{
return (array ) $this->_fetch_all($testValue);
}
protected function _fetch_all($testValue = true )
{
$goodData = array(
0 => array(
'name' => 'vasya',
'pass' => 'oyamd5withsolt',
),
1 => array(
'name' => 'vasay',
'pass' => 'oyamd5withsolt2',
),
);
try
{
;//do smth
}
catch (Exception $e)
{
return false; //strange architector
}
$retValue = $testValue ? $goodData : false;
var_dump($retValue);
return $retValue;
}
}
$ob = new ExampleDb();
$users = $ob->findAll(false);// error happens !
//strange dev
if ( isset($users[0]) )
echo "You win! Your prize 10000k euros from dev salary!";
?>
cd@cd-laptop:~$ php ex1.php
(bool)false // мы видим что была ошибка
You win! Your prize 10000k euros from dev salary!cd@cd-laptop:~$
// но тем не менее кто то выйграл.
//Ну что теперь 10 лет работаем на еду?
ini_set ( 'display_errors', 'on' );
error_reporting ( E_ALL );
class MyDB extends PDO {
public $connectionId = 0;
}
class MyFactory {
protected static $_storage = array ();
static public function get($id) {
if ( isset ( self::$_storage[$id] ))
return self::$_storage[$id];
self::$_storage[$id] = new MyDB ( 'mysql:host=127.0.0.1;dbname=toox2;', 'root', '123', array (PDO::ATTR_PERSISTENT => true ) );
self::$_storage[$id]->connectionId = $id;
return self::$_storage[$id];
}
}
$db1 = MyFactory::get( 1 );
$db2 = MyFactory::get( 2 );
var_dump( $db1 );
var_dump( $db2 );
cd@cd-laptop:~/tmp/php-tests$ php test.php
object(MyDB)#1 (1) {
["connectionId"]=>
int(2)
}
object(MyDB)#2 (1) {
["connectionId"]=>
int(2)
}
array (PDO::ATTR_PERSISTENT => true )
cd@cd-laptop:~/tmp/php-tests$ php -v
PHP 5.2.4-2ubuntu5.3 with Suhosin-Patch 0.9.6.2 (cli) (built: Jul 23 2008 06:44:49)
Copyright (c) 1997-2007 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies
sudo apt-get install trac
cd@cd-laptop: cd
cd@cd-laptop: mkdir tests
cd@cd-laptop: cd tests
cd@cd-laptop: mkdir tracdir
cd@cd-laptop: trac-admin tracdir initenv
жмем энтер :)
Запускаем через stand-along
cd@cd-laptop: tracd /home/cd/tests/tracdir --port 8888
cd@cd-laptop: firefox http://127.0.0.1:8888/tracdir
cd@cd-laptop: Ctrl+C
cd@cd-laptop:
cd plugins
touch Hello.py
from trac.core import *
from trac.wiki.macros import WikiMacroBase
from trac.util import escape
__all__ = ['HelloMacro']
class HelloMacro(WikiMacroBase):
def expand_macro(self,formatter, name, args):
return "Hello %s" % args or '
[[Hello(cd)]]
Hello cd
1 from trac.core import *
2 from trac.wiki.macros import WikiMacroBase
3 from trac.util import escape
4 from trac.util.html import escape,html,plaintext
5 from genshi.builder import tag
6
7
8 __all__ = ['XxxMacro']
9
10
11 class RwebtableMacro(WikiMacroBase):
12 """
13 Show table schema
14 {{{
15 [[Xxx(tablename)]]
16 }}}
17
18 """
19 def expand_macro(self, formatter, name, args):
20 # args will be `None` if the macro is called without parenthesis.
21 table = args or ''
22 if not table :
23 return 'no table specified'
24
25 import MySQLdb
26 user = self.env.config.get('cddb', 'user')#требует опции в trac.ini секции [cddb]
27 host = self.env.config.get('cddb', 'host')
28 passwd = self.env.config.get('cddb', 'passwd')
29 dbname = self.env.config.get('cddb', 'dbname')
30 db = MySQLdb.connect(user=user, host=host, passwd=passwd, db=dbname)
31 cursor = db.cursor()
32 sql = "DESCRIBE %s" % table
33 cursor.execute(sql)
34 table = tag.table(border=1)
35 table.append(tag.tr( tag.th('Field'), tag.th('Type') , tag.th('Null') , tag.th('Key') , tag.th('Default'), tag.th('Extra') ) )
36 res = cursor.fetchall()
37 for row in res :
38 tr = tag.tr()
39 for i in row :
40 tr.append(tag.td(str(i)) )
41 table.append(tr)
42 return str(table)
Field | Type | Null | Key | Default | Extra |
---|---|---|---|---|---|
country_id | int(11) | NO | PRI | None | auto_increment |
iso | varchar(3) | YES | None | ||
name | varchar(50) | YES | None |
директория для тестов
cd@cd-laptop:~$ mkdir tests
cd@cd-laptop:~$ cd tests
директория для репозитория
cd@cd-laptop:~/tests$ mkdir repo
создание репозитория
cd@cd-laptop:~/tests$ svnadmin create repo
директория для чекаутов
cd@cd-laptop:~/tests$ mkdir checkout-dir
первый чекаут
cd@cd-laptop:~/tests$ svn checkout file:///home/cd/tests/repo/ checkout-dir/
Checked out revision 0.
создаем, добавляем, коммитим файл.
cd@cd-laptop:~/tests$ touch checkout-dir/x.txt
cd@cd-laptop:~/tests$ svn add checkout-dir/x.txt
checkout-dir/x.txt
cd@cd-laptop:~/tests$ svn ci checkout-dir/x.txt -m'first commit'
Adding checkout-dir/x.txt
Transmitting file data .
Committed revision 1.
cd@cd-laptop:~/tests$
Заходим в папку репозитоия
cd@cd-laptop:~/tests$ cd repo/
смотрим чего есть. Интересует папка hooks
cd@cd-laptop:~/tests/repo$ ls
conf dav db format hooks locks README.txt
cd@cd-laptop:~/tests/repo$ cd hooks/
Заходим в нее.
cd@cd-laptop:~/tests/repo/hooks$ ls
post-commit.tmpl post-revprop-change.tmpl pre-commit.tmpl pre-revprop-change.tmpl start-commit.tmpl
post-lock.tmpl post-unlock.tmpl pre-lock.tmpl pre-unlock.tmpl
Создаем, делаем права на запуск, заполняем
cd@cd-laptop:~/tests/repo/hooks$ touch pre-commit
cd@cd-laptop:~/tests/repo/hooks$ chmod +x pre-commit
cd@cd-laptop:~/tests/repo/hooks$ cat > pre-commit
#!/usr/bin/python
import sys
sys.stderr.write('Test error')
sys.exit(1)
cd@cd-laptop:~/tests/repo/hooks$ cd ../..
cd@cd-laptop:~/tests$ echo '1' >> checkout-dir/x.txt
cd@cd-laptop:~/tests$ svn ci checkout-dir/x.txt -m'test'
Sending checkout-dir/x.txt
Transmitting file data .svn: Commit failed (details follow):
svn: 'pre-commit' hook failed with error output:
Test error
cd@cd-laptop:~/tests$
#!/usr/bin/python
import sys
#пишем в STDERR
sys.stderr.write('Test error')
#выходим с кодом возврата 1
sys.exit(1)
author
cat
changed
date
diff
dirs-changed
help (?, h)
history
info
lock
log
propget (pget, pg)
proplist (plist, pl)
tree
uuid
youngest
any subcommand which takes the '--revision' and '--transaction'
REPOS="$1"
TXN="$2"
# Make sure that the log message contains some text.
SVNLOOK=/usr/bin/svnlook
$SVNLOOK log -t "$TXN" "$REPOS" | grep "[a-zA-Z0-9]" > /dev/null || exit 1
#!/usr/bin/python
import sys
import os
#обертка над svnlook для запуска любой команды
def cmd_out(subcommand, transaction, repo) :
cmd = '/usr/local/bin/svnlook %s -t "%s" "%s"' % (subcommand, transaction, repo)
str = os.popen(cmd, 'r').read()
return str.strip('\n')
#вызвает нашу оберку, для подкомманды author
def look_author(transaction, repo) :
return cmd_out('author', transaction, repo )
#читаем репозиторий, транзакцию
repos = sys.argv[1]
txn = sys.argv[2]
#получаем автора
author = look_author(txn, repos)
#пишем автора в STDERR
sys.stderr.write('Author :%s:' % author )
#выходим с ошибкой, запрещая коммит
sys.exit(1)
def look_log (transaction, repo) :
return cmd_out('log', transaction, repo)
#!/usr/bin/python
import sys, os, string, re
# return true or false if this passed string is a valid comment
php_devs = ('xx', 'xxx', 'yy', 'yyy', 'zz', 'zzz') #only for this dev's rules allowed
def cmd_out(subcommand, transaction, repo) :
cmd = '/usr/local/bin/svnlook %s -t "%s" "%s"' % (subcommand, transaction, repo)
str = os.popen(cmd, 'r').read()
return str.strip('\n')
def look_info(trans, repo) :
return cmd_out('tree --full-paths', trans, repo)
def look_author(transaction, repo) :
return cmd_out('author', transaction, repo )
def look_log (transaction, repo) :
return cmd_out('log', transaction, repo)
def check_comments(comment ):#return ticket id if find in comment
p = re.compile('\s*ticket:(\d+)(:close)?\s+(.*)$', re.MULTILINE)
res = p.match(comment)
try:
ticket_id = res.group(1)
except:
ticket_id = None
return ticket_id
def need_close(comment) : #i know it's copy paste, but i had choice, write into blog, or rewrite it ...
p = re.compile('\s*ticket:(\d+)(:(close))?\s+(.*)$', re.MULTILINE)
res = p.match(comment)
try:
is_closed = res.group(3)
except:
is_closed = ''
return is_closed == 'close'
def update_ticket_in_trac(ticket, author, comment, data ) :
import xmlrpclib
s = xmlrpclib.ServerProxy('http://tracuser:tracpast@domain.com:port/path_to_Trac/login/xmlrpc')#create service
try:
ticketInfo = s.ticket.get(ticket)#try get ticket
status = ticketInfo[3]['status']
if status == 'closed' :
sys.stderr.write("Ticket already closed, need reopen it first !!!")
return 1
except: #can catch here protocol err, it mean no rights
sys.stderr.write("No ticket found in trac for id %s" % ticket )
return 1
comment = comment.replace(':close','')
s.ticket.update(ticket,comment.replace("ticket:%s" % ticket, '%s killed himself with message : \n' % author , data) , data)
return 0
def main(repos, txn):
comment = look_log(txn, repos)
author = look_author(txn,repos)
if not (author in php_devs) :
return 0
ticket = check_comments(comment)
if ticket == None :
sys.stderr.write("\nticket:num must be at the comment begin where num is ticket id, if not exists create it please!")
return 1
data = dict()
if ( need_close(comment) ) :
data['status'] = 'closed'
return update_ticket_in_truck(ticket, author,comment, data )
if __name__ == '__main__':
if len(sys.argv) < 3 :
sys.stderr.write("Usage: %s REPOS TXN\n" % (sys.argv[0]))
else:
sys.exit(main(sys.argv[1], sys.argv[2]))
error_reporting(E_ALL);
$array = array();
for ( $k = 1; $k < 10; $k++)
{
unset($array);
$array = array();
for ($i = 0 ; $i < 100000; $i++)
{
$array[$i] = $i + $k;
}
}
?>
class SplArrayTest implements ArrayAccess
{
protected $_data;
public function __construct()
{
$this->_data = array();
}
public function offsetExists($offset)
{
return isset($this->_data[$offset]);
}
public function offsetGet($offset)
{
return $this->_data[$offset];
}
public function offsetSet($offset, $value)
{
$this->_data[$offset] = $value;
}
public function offsetUnset($offset)
{
unset($this->_data[$offset]);
}
public function __destruct()
{
unset($this->_data);
}
}
$array = new SplArrayTest();
for ( $k = 1; $k < 10; $k++)
{
unset($array);
$array = new SplArrayTest();
for ($i = 0 ; $i < 100000; $i++)
{
$array[$i] = $i + $k;
}
}
?>
class SplArrayTest implements ArrayAccess
{
public function __construct()
{
}
public function offsetExists($offset)
{
return isset($this->$offset);
}
public function offsetGet($offset)
{
return $this->$offset;
}
public function offsetSet($offset, $value)
{
$this->$offset = $value;
}
public function offsetUnset($offset)
{
$this->$offset;
}
public function __destruct()
{
}
}
$array = new SplArrayTest();
for ( $k = 1; $k < 10; $k++)
{
unset($array);
$array = new SplArrayTest();
for ($i = 0 ; $i < 100000; $i++)
{
$array[$i] = $i + $k;
}
}
?>
class My_Exception extends Exception {
public static function errorHandlerCallback($code, $string, $file, $line, $context)
{
$e = new self($string, $code);
$e->line = $line;
$e->file = $file;
$e->context = $context;
throw $e;
}
}
set_error_handler(array("My_Exception", "errorHandlerCallback"), E_ALL);
// bla bla bla
try
{
$controller->dosmth();
}
catch( Controller_Wrong_Data_Exeption $e)
{
// do smth
}
catch ( My_Exception $e)
{
// we know it's php error
}
public function xxx($param1,$param2)
{
return $this->agregatedObject->xxx($param1, $param2);
}
?>
class A
{
public function f1()
{
}
}
class B
{
protected $_a = null;
public function __construct(A $a)
{
$this->_a = $a;
}
public function __call($function, $params)
{
return call_user_func_array(array(&$this->_a, "A::$function"), $params );
}
}
//как работает
$a = A();
$b = B($a);
$a->f1();
$b->f1();// тоже самое что и строчкой выше. Произойдет вызов метода f1 объекта $a
?>
class View
{
public function render($template)
{
//return html
}
public function f1()
{
}
//...
public function f120()
{
}
}
class Cache_View
{
protected $_view = null;
protected $_cache = null
public function setCache($cache)
{
$this->_cache = $cache;
}
public function __construct(View $v)
{
$this->_view = $v;
}
public function __call($function, $params)
{
return call_user_func_array(array(&$this->_view, "View::$function"), $params );
}
public function render($template)
{
if ( $this->_cache != null && ! $this->_cache->mis($this->makeKey($template))// если объект кэша есть и в нем чего то лежит
return $this->_cache->get($this->makeKey($template));// то вернем закэшированные данные
$out = $this->_view->render($template);
if ( $this->_cache != null)
$this->_cache->set($this->makeKey($template), $out);
return $out;
}
public function makeKey($str)
{
retirm md5($str);
}
}
//примеры исползования
$view = View();
$cache = Cache::create(Cache::File);
$cachedView = Cached_View($view);
$cachedView->setCache($cache):
$view->test();
$cachedView->test();// тоже самое что и строчкой выше. Вызов метода агрегированного класса
$cachedView->render('splash.php'); // а вот здесь будет предприняты попытка заглянуть в кэш и вернуть закэшированные результаты, если их нет, то произойдет отработка обычного $view->render и результат положится в темплейт
?>
class Base()
{
public function base_function() {};
}
class A
{
public function f1()
{
}
}
class B extends Base
{
protected $_a = null;
public function __construct(A $a)
{
$this->_a = $a;
}
public function __call($function, $params)
{
return call_user_func_array(array(&$this->_a, "A::$function"), $params );// понятно что тут можно проверять наличичие метода поочереди у пула объектов, и вызывать их
}
}
$a = new A();
$b = new B($a);
$b->base_function(); //ok child Base
$b->f1(); // looks like child A
header("Location: bla bla bla");
exit();
register_shutdown_function('callback');
class Rapid
{
//...
public static function quit()
{
//write to log
}
//..
}
// тут как раз регистрируем статическую функцию, как функцию по завершению
register_shutdown_function(array('Rapid', 'quit'));
cd@cd-laptop:~/tmp$ cat 2.php
register_shutdown_function('quit');
echo 'start';
require_once('none.php'); // у меня нет файла, будет фатал.
echo 'end';
function quit()
{
echo 'quit';
}
cd@cd-laptop:~/tmp$ php 2.php
start
Warning: require_once(none.php): failed to open stream: No such file or directory in /home/cd/tmp/2.php on line 7
Fatal error: require_once(): Failed opening required 'none.php' (include_path='.:/usr/share/php:/usr/share/pear') in /home/cd/tmp/2.php on line 7
quit
cd@cd-laptop:~/tmp$
apt-get update
W: GPG error: http://mirror.yandex.ru stable Release: Следующие подписи не могут быть проверены, так как недоступен общий ключ: NO_PUBKEY 07DC563D1F41B907
# gpg --keyserver wwwkeys.eu.pgp.net --recv-keys 07DC563D1F41B907
gpg: requesting key 1F41B907 from hkp server wwwkeys.eu.pgp.net
gpg: /root/.gnupg/trustdb.gpg: trustdb created
gpg: key 1F41B907: public key "Christian Marillat <marillat@debian.org>" imported
gpg: no ultimately trusted keys found
gpg: Total number processed: 1
gpg: imported: 1
# gpg --armor --export 1F41B907 | apt-key add -
Thursday, May 8, 2008
ZSE + XDEBUG
3:07AM PDT · dtaylor7
I think Zend hates xdebug... But the ZSE contains a full PDT (it has xdebug support). So, remove (move) the plugins/com.zend.php.debug*, then start the studion with "ZendStudio -clean"
Hmm, there will be xdebug support in the PHP Debugger select... I tested it, works.
perl -n -e '$out{$1}=1 if /user (\S+) without confirm/ ;END{ print keys %out}'
Powered by ScribeFire.
Powered by ScribeFire.
Powered by ScribeFire.
#sudo apt-get install ia32-sun-java5-bin
в моем случае
sudo apt-get install ia32-sun-java6-bin
cd ~/eclipse // перехожу в папку где установлен эклипс
touch eclipse.sh
chmod +x eclipse.sh
vim eclipse.sh
#!/bin/bash
PATH=/usr/lib/jvm/ia32-java-6-sun/bin:$PATH
/home/user/eclipse/eclipse
chmod +x eclipse.sh
Powered by ScribeFire.
apt-get install squid
vim /etc/squid/squid.conf
нашел
http_access allow localhost
Поменял на
acl allowed_hosts src xx.xx.xx.xx/255.255.255.0
http_access allow allowed_hosts
Где xx.xx.xx.xx мой айпи наружу.
/etc/init.d/squid restart
Firefox + mm proxy swith
Прописываю proxy myhosting:3128
Все работает
Powered by ScribeFire.
Powered by ScribeFire.
Powered by ScribeFire.
[user@host ~]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Место для хранения ключа (я нажал enter)
Enter file in which to save the key (/home/user/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user/.ssh/id_rsa.
Your public key has been saved in /home/user/.ssh/id_rsa.pub.
The key fingerprint is:
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx user@host
[user@host ~]$
user@host$ ssh-copy-id user2@host2
Now try logging into the machine, with "ssh 'user2@host2'", and check in:
.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.
Копируем через scp
user@host$ scp ~/.ssh/id_rsa.pub user2@host2:/home/user2/
Коннектимся
ДОбавляем публичный ключ
user@host2$cat ~/id_rsa.pub >> ~/.ssh/authorized_keys2
user@desktop:~$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/cd/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
// оставил пустыми
Your identification has been saved in /home/user/.ssh/id_rsa.
Your public key has been saved in /home/user/.ssh/id_rsa.pub.
The key fingerprint is:
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx user@desktop
user@desktop:~$ cat /home/user/.ssh/id_rsa.pub
ssh-rsa xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx== user@desktop
$ssh-copy-id login@host
askeet замените на название своего репозитария.
localhost (в конце при разметке репозитария на firstvds.ru нужнозаменить на 127.0.0.1)
репозитарий будет доступен потом по урл http://host/svn/name_of_repository
Если нужно чтобы пароль был на все операции закоменнтируете
#<LimitExcept GET PROPFIND OPTIONS REPORT>
Require valid-user
#</LimitExcept>
wget http://fpdownload.macromedia.com/get/flashplayer
/current/install_flash_player_9_linux.tar.gz
tar -xvzf ./install_flash_player_9_linux.tar.gz
mkdir ~/.mozilla/plugins
cp install_flash_player_9_linux/libflashplayer.so ~/.mozilla/firefox/plugins
sudo apt-get install nspluginwrapper
nspluginwrapper -i ~/.mozilla/plugins/libflashplayer.so
nspluginwrapper -i ~/.mozilla/plugins/libflashplayer.sonspluginwrapper: /home/cd/.mozilla/plugins/libflashplayer.so is not a valid NPAPI plugin
Powered by ScribeFire.