<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>smallfish logs &#187; Java</title>
	<atom:link href="http://chenxiaoyu.org/blog/archives/tag/java/feed" rel="self" type="application/rss+xml" />
	<link>http://chenxiaoyu.org</link>
	<description>关注 Python &#38; Go &#38; PostgreSQL</description>
	<lastBuildDate>Sat, 07 Aug 2010 10:31:22 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Java调用Linux SCP操作</title>
		<link>http://chenxiaoyu.org/blog/archives/131</link>
		<comments>http://chenxiaoyu.org/blog/archives/131#comments</comments>
		<pubDate>Wed, 16 Dec 2009 01:18:21 +0000</pubDate>
		<dc:creator>smallfish</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://chenxiaoyu.org/blog/?p=131</guid>
		<description><![CDATA[先来回顾下linux下scp命令的用法：
[shell $] scp -r /本地目录或文件 user@192.168.0.110:/远程目录
这条命令是把本地的目录或者文件拷贝到远程192.168.0.110一个目录下，如果是从远程拷到本地，则反一下ip和目录。-r则是递归目录。更多参见scp &#8211;help
最近在Java里调用scp，是通过一个JSP页面来触发。为了在调用系统命令时候不出现提示密码，两台机器配置好了信任关系，可以参考ssh, scp不输入密码，大致代码如下：
Runtime.getRuntime().exec("scp /aa.txt root@192.168.0.110:/bb");
try时候也没任何异常，但是文件没拷贝过去，最后根据Process的waitFor()获取命令返回值是1。
这下可以肯定的是调用系统命令失败，在System.out.println里打印出command，linux下运行是没错的。为何呢？
后来发现原来是用户权限的问题，默认apache运行用户是nobody，根本没权限调用scp命令，配置的信任关系也是本机的root用户。
那就重新加一个user把，adduser&#8230;到配置好信任关系，在scp -i 指定一个rsa文件，并把rsa文件复制到/tmp目录下，权限为0755，继续刷新，后台可以看到提示输入密码之类的output了。
貌似还比较棘手，最后还是搜了下，发现有关Java scp的库，Ganymed SSH-2 for Java。貌似比较老，先来测试一下把。
Connection conn = new Connection(“192.168.0.110”);
conn.connect();
boolean isAuthenticated = conn.authenticateWithPassword(“root”, "***********");
if (isAuthenticated == false)
    throw new IOException("Authentication failed.");
SCPClient client = new SCPClient(conn);
client.put("/aa.txt", "/bb");
conn.close();
OK！发现竟然可以一次运行了。算了就不调用系统命令了，直接使用这个库把。
client.put方法第一个参数可以是个数组，即文件名的数组。暂时没找到整个目录的方法，就自己手动获取下目录文件列表把。

© smallfish for smallfish logs, 2009. &#124;
Permalink &#124;
No comment &#124;
Add to
del.icio.us

Post tags: Java







Feed enhanced by Better Feed [...]]]></description>
			<content:encoded><![CDATA[<p>先来回顾下linux下scp命令的用法：</p>
<pre>[shell $] scp -r /本地目录或文件 user@192.168.0.110:/远程目录</pre>
<p>这条命令是把本地的目录或者文件拷贝到远程192.168.0.110一个目录下，如果是从远程拷到本地，则反一下ip和目录。-r则是递归目录。更多参见scp &#8211;help</p>
<p>最近在Java里调用scp，是通过一个JSP页面来触发。为了在调用系统命令时候不出现提示密码，两台机器配置好了信任关系，可以参考<a href="http://chenxiaoyu.org/blog/archives/133" target="_blank">ssh, scp不输入密码</a>，大致代码如下：</p>
<pre>Runtime.getRuntime().exec("scp /aa.txt root@192.168.0.110:/bb");</pre>
<p>try时候也没任何异常，但是文件没拷贝过去，最后根据Process的waitFor()获取命令返回值是1。</p>
<p>这下可以肯定的是调用系统命令失败，在System.out.println里打印出command，linux下运行是没错的。为何呢？</p>
<p>后来发现原来是用户权限的问题，默认apache运行用户是nobody，根本没权限调用scp命令，配置的信任关系也是本机的root用户。</p>
<p>那就重新加一个user把，adduser&#8230;到配置好信任关系，在scp -i 指定一个rsa文件，并把rsa文件复制到/tmp目录下，权限为0755，继续刷新，后台可以看到提示输入密码之类的output了。</p>
<p>貌似还比较棘手，最后还是搜了下，发现有关Java scp的库，<a href="http://www.ganymed.ethz.ch/ssh2/" target="_blank">Ganymed SSH-2 for Java</a>。貌似比较老，先来测试一下把。</p>
<pre>Connection conn = new Connection(“192.168.0.110”);
conn.connect();
boolean isAuthenticated = conn.authenticateWithPassword(“root”, "***********");
if (isAuthenticated == false)
    throw new IOException("Authentication failed.");
SCPClient client = new SCPClient(conn);
client.put("/aa.txt", "/bb");
conn.close();</pre>
<p>OK！发现竟然可以一次运行了。算了就不调用系统命令了，直接使用这个库把。</p>
<p>client.put方法第一个参数可以是个数组，即文件名的数组。暂时没找到整个目录的方法，就自己手动获取下目录文件列表把。</p>
<hr />
<p><small>© smallfish for <a href="http://chenxiaoyu.org">smallfish logs</a>, 2009. |
<a href="http://chenxiaoyu.org/blog/archives/131">Permalink</a> |
<a href="http://chenxiaoyu.org/blog/archives/131#comments">No comment</a> |
Add to
<a href="http://del.icio.us/post?url=http://chenxiaoyu.org/blog/archives/131&title=Java调用Linux SCP操作">del.icio.us</a>
<br/>
Post tags: <a href="http://chenxiaoyu.org/blog/archives/tag/java" rel="tag">Java</a><br/>
</small></p>
<p>
<script type="text/javascript"><!--
google_ad_client = "pub-8914011260472945";
/* 468x60, 创建于 09-11-19 */
google_ad_slot = "7198645178";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</p>
<p><small>Feed enhanced by <a href='http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/'>Better Feed</a> from  <a href='http://planetozh.com/blog/'>Ozh</a></small></p>
]]></content:encoded>
			<wfw:commentRss>http://chenxiaoyu.org/blog/archives/131/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Memcached Java &amp;&amp; Python Client API 共享</title>
		<link>http://chenxiaoyu.org/blog/archives/114</link>
		<comments>http://chenxiaoyu.org/blog/archives/114#comments</comments>
		<pubDate>Tue, 15 Dec 2009 01:24:22 +0000</pubDate>
		<dc:creator>smallfish</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Memcached]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://chenxiaoyu.org/blog/?p=114</guid>
		<description><![CDATA[用Python写了一个计划任务，定时更新Memcached中一个key值，写的很happy，几分钟搞定。
然后在Java Servlet测试，代码写的也很happy，编译 &#8211; 刷新，一气呵成。
然后发现值一直是null，再tail日志看看，异常不断：
com.danga.MemCached.MemCachedClient Mon Jul 20 09:37:04 CST 2009 - ++++ exception thrown while trying to get object from cache for key: test_num
 com.danga.MemCached.MemCachedClient Mon Jul 20 09:37:04 CST 2009 - 3
 com.danga.MemCached.NestedIOException: 3
 at com.danga.MemCached.MemCachedClient.get(MemCachedClient.java:1408)
 at com.danga.MemCached.MemCachedClient.get(MemCachedClient.java:1270)
晕倒，记得以前为了让两个语言实现API读写共享，手动去修改了两个的API包，实现了中文互读写。难不成今儿个还要手动去搞一把？
然后手动试了下：

shell&#62; telnet xxxxxx 11211
get test_num
VALUE test_num 4 2
23
经查证VALUE协议返回的是 key flags len \r\n value 这样的格式，大悟：原来flags不一样啊，Java里面对int型赋值以后flags是0，而Python里则不一样，两者序列化的东西不同啊。懒得去 折腾两者序列化有啥不同。来点直接的把。
然后打开Python Memcached API，大概578行_val_to_store_info方法里，可以看到flags部分，是根据变量类型进行定义的，isinstance(val, [...]]]></description>
			<content:encoded><![CDATA[<p>用Python写了一个计划任务，定时更新Memcached中一个key值，写的很happy，几分钟搞定。</p>
<p>然后在Java Servlet测试，代码写的也很happy，编译 &#8211; 刷新，一气呵成。</p>
<p>然后发现值一直是null，再tail日志看看，异常不断：</p>
<pre>com.danga.MemCached.MemCachedClient Mon Jul 20 09:37:04 CST 2009 - ++++ exception thrown while trying to get object from cache for key: test_num
 com.danga.MemCached.MemCachedClient Mon Jul 20 09:37:04 CST 2009 - 3
 com.danga.MemCached.NestedIOException: 3
 at com.danga.MemCached.MemCachedClient.get(MemCachedClient.java:1408)
 at com.danga.MemCached.MemCachedClient.get(MemCachedClient.java:1270)</pre>
<p>晕倒，记得以前为了让两个语言实现API读写共享，手动去修改了两个的API包，实现了中文互读写。难不成今儿个还要手动去搞一把？</p>
<p>然后手动试了下：</p>
<pre>
shell&gt; telnet xxxxxx 11211
get test_num
VALUE test_num 4 2
23</pre>
<p>经查证VALUE协议返回的是 key flags len \r\n value 这样的格式，大悟：原来flags不一样啊，Java里面对int型赋值以后flags是0，而Python里则不一样，两者序列化的东西不同啊。懒得去 折腾两者序列化有啥不同。来点直接的把。</p>
<p>然后打开Python Memcached API，大概578行_val_to_store_info方法里，可以看到flags部分，是根据变量类型进行定义的，isinstance(val, str) 如果是str则pass。</p>
<p>到这里就简单了，直接在py代码里：mc.set(&#8216;test_num&#8217;, str(num))</p>
<p>Java读取OK。</p>
<hr />
<p><small>© smallfish for <a href="http://chenxiaoyu.org">smallfish logs</a>, 2009. |
<a href="http://chenxiaoyu.org/blog/archives/114">Permalink</a> |
<a href="http://chenxiaoyu.org/blog/archives/114#comments">No comment</a> |
Add to
<a href="http://del.icio.us/post?url=http://chenxiaoyu.org/blog/archives/114&title=Memcached Java &#038;&#038; Python Client API 共享">del.icio.us</a>
<br/>
Post tags: <a href="http://chenxiaoyu.org/blog/archives/tag/java" rel="tag">Java</a>, <a href="http://chenxiaoyu.org/blog/archives/tag/memcached" rel="tag">Memcached</a>, <a href="http://chenxiaoyu.org/blog/archives/tag/python" rel="tag">Python</a><br/>
</small></p>
<p>
<script type="text/javascript"><!--
google_ad_client = "pub-8914011260472945";
/* 468x60, 创建于 09-11-19 */
google_ad_slot = "7198645178";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</p>
<p><small>Feed enhanced by <a href='http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/'>Better Feed</a> from  <a href='http://planetozh.com/blog/'>Ozh</a></small></p>
]]></content:encoded>
			<wfw:commentRss>http://chenxiaoyu.org/blog/archives/114/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
