1. 登录到远端计算机
在客户端登录到远端计算机使用ssh命令,常用的格式为:
ssh user_name@远端计算机IP
很多时候会忘记加上user_name,那么默认的就是使用本地账户登录到远端计算机。如果你运气足够好的话,远端和本地具有相同的账户,并且你知道远端该用户的密码,那么你能够登录成功,否则,还是老老实实的加上远端计算机的用户名吧。输入该命令后,会提示你数据一个密码,该密码就是远端计算机帐户的密码,输入正确后,登录成功。

2. 文件传输
ssh命令只是登录到远端计算机上,这样你可以操作远端计算机。但是有时候我们并不需要登录到远端计算机,只是在远端计算机和本地传输文件,有两个命令sftp和sch。

2.1 sftp
上传文件到远端计算机命令如下:
put 本地文件 远端计算机目录
下载文件到本地计算机命令如下:
get 远端文件 本地目录

2.2 scp
scp命令格式如下:
scp 文件 账户@远端计算机IP:目录名
scp 账户 @远端计算机IP:文件 本地目录

同cp命令一样,复制目录时可以加上-r选项。


// 2015.08.31 add
1. ssh配置无密码访问
首先使用ssh-keygen -t rsa生成密钥,然后将id_rsa.pub中的内容复制到远端计算机的.ssh/authorized_keys文件中,好了可以无密码访问远端计算机了。

2. 远端目录挂载到本地
有些时候,我们需要访问远端计算机,例如拷贝文件到远端计算机,或拷贝远端计算机中的文件到本地,当然可以使用scp命令,但是稍显麻烦,尤其是要经常访问的时候,那么我们有什么办法可以将远端目录挂载到本地呢,这里使用sshfs来挂载,当然nfs也是可以的,但这就需要对远端计算机做一些配置,这就需要有管理权限。

首先是安装sshfs,使用命令sudo apt-get install sshfs来安装,手动来挂载一下试试,命令用法如下:

sshfs [user@]host:[dir] mountpoint [options]



卸载的命令在下面:


fusermount -u mountpoint



每次去手动输入上面的命令有点麻烦,能开机自动挂载吗,这是可以的,需要下面几个步骤:

首先修改/etc/fstab,添加如下内容:

# <file system>       <mount point>         <type>  <options>
sshfs#myname@www.myhome.com:/home/myname    /mnt/sshfs/homebox    fuse    comment=sshfs,noauto,users,exec,uid=1000,gid=1000,allow_other,reconnect,transform_symlinks,BatchMode=yes 0 0

当然username、远端目录,挂载点都要设置成你自己的。



然后修改/etc/fuse.conf,如果没有这个文件就自己创建一个,添加下面的内容:

user_allow_other

同时将权限修改成755,例如:sudo chmod 755 /etc/fuse.conf。



可以使用下面的命令测试是否能够自动挂在:


mount /mnt/sshfs/homebox


执行上面的命令之后,再使用mount命令看一下是否能挂载成功。


然后再来设置当网络连接后自动挂载,新增一个文件/etc/network/if-up.d/mountsshfs,在mountsshfs中添加下面的内容:

#!/bin/sh

## http://ubuntuforums.org/showthread.php?t=430312
## The script will attempt to mount any fstab entry with an option
## "...,comment=$SELECTED_STRING,..."
## Use this to select specific sshfs mounts rather than all of them.
SELECTED_STRING="sshfs"

# Not for loopback
[ "$IFACE" != "lo" ] || exit 0

## define a number of useful functions

## returns true if input contains nothing but the digits 0-9, false otherwise
## so realy, more like isa_positive_integer 
isa_number () {
    ! echo $1 | egrep -q '[^0-9]'
    return $?
}

## returns true if the given uid or username is that of the current user
am_i () {
	[ "$1" = "`id -u`" ] || [ "$1" = "`id -un`" ]
}

## takes a username or uid and finds it in /etc/passwd
## echoes the name and returns true on success
## echoes nothing and returns false on failure 
user_from_uid () {
    if isa_number "$1"
    then
		# look for the corresponding name in /etc/passwd
    	local IFS=":"
    	while read name x uid the_rest
    	do
        	if [ "$1" = "$uid" ]
			then 
				echo "$name"
				return 0
			fi
    	done </etc/passwd
    else
    	# look for the username in /etc/passwd
    	if grep -q "^${1}:" /etc/passwd
    	then
    		echo "$1"
    		return 0
    	fi
    fi
    # if nothing was found, return false
   	return 1
}

## Parses a string of comma-separated fstab options and finds out the 
## username/uid assigned within them. 
## echoes the found username/uid and returns true if found
## echoes "root" and returns false if none found
uid_from_fs_opts () {
	local uid=`echo $1 | egrep -o 'uid=[^,]+'`
	if [ -z "$uid" ]; then
		# no uid was specified, so default is root
		echo "root"
		return 1
	else
		# delete the "uid=" at the beginning
		uid_length=`expr length $uid - 3`
		uid=`expr substr $uid 5 $uid_length`
		echo $uid
		return 0
	fi
}

# unmount all shares first
sh "/etc/network/if-down.d/umountsshfs"

while read fs mp type opts dump pass extra
do
    # check validity of line
    if [ -z "$pass" -o -n "$extra" -o "`expr substr ${fs}x 1 1`" = "#" ]; 
    then
        # line is invalid or a comment, so skip it
        continue
    
    # check if the line is a selected line
    elif echo $opts | grep -q "comment=$SELECTED_STRING"; then
    	
    	# get the uid of the mount
        mp_uid=`uid_from_fs_opts $opts`
        
        if am_i "$mp_uid"; then
			# current user owns the mount, so mount it normally
			{ sh -c "mount $mp" && 
				echo "$mp mounted as current user (`id -un`)" || 
				echo "$mp failed to mount as current user (`id -un`)"; 
			} &
		elif am_i root; then
			# running as root, so sudo mount as user
			if isa_number "$mp_uid"; then
				# sudo wants a "#" sign icon front of a numeric uid
				mp_uid="#$mp_uid"
			fi 
			{ sudo -u "$mp_uid" sh -c "mount $mp" && 
				echo "$mp mounted as $mp_uid" || 
				echo "$mp failed to mount as $mp_uid"; 
			} &
		else
			# otherwise, don't try to mount another user's mount point
			echo "Not attempting to mount $mp as other user $mp_uid"
		fi
    fi
    # if not an sshfs line, do nothing
done </etc/fstab

wait



再新增一个文件/etc/network/if-down.d/umountsshfs,内容如下:

#!/bin/bash

# Not for loopback!
[ "$IFACE" != "lo" ] || exit 0

# comment this for testing
exec 1>/dev/null # squelch output for non-interactive

# umount all sshfs mounts
mounted=`grep 'fuse.sshfs\|sshfs#' /etc/mtab | awk '{ print $2 }'`
[ -n "$mounted" ] && { for mount in $mounted; do umount -l $mount; done; }



修改权限:sudo chmod 755 /etc/network/if-up.d/mountsshfs /etc/network/if-down.d/umountsshfs



重启之后,远端目录自动挂载到了本地,也可以使用命令sudo ifconfig eth0 up命令来测试是否能自动挂载,但是执行sudo ifconfig eth0 down时不能卸载,这是个问题。