① linux 使用scp命令從一台機器復制文件到另一台linux機器上去
scp是 secure 的縮寫, scp是 linux 系統下基於ssh登陸進行安全的遠程文件拷貝命令。 linux 的scp命令可以在linux 伺服器 之間復制文件和目錄.
scp命令基本格式:
scp [-1246BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file]
[-l limit] [-o ssh_option] [-P port] [-S program]
[[user@]host1:]file1 [...] [[user@]host2:]file2
scp命令的參數說明:
-1
強制scp命令使用協議ssh1
-2
強制scp命令使用協議ssh2
-4
強制scp命令只使用IPv4定址
-6
強制scp命令只使用IPv6定址
-B
使用批處理模式(傳輸過程中不詢問傳輸口令或短語)
-C
允許壓縮。(將-C標志傳遞給ssh,從而打開壓縮功能)
-p 保留原文件的修改時間,訪問時間和訪問許可權。
-q
不顯示傳輸進度條。
-r
遞歸復制整個目錄。
-v 詳細方式顯示輸出。scp和ssh(1)會顯示出整個過程的調試信息。這些信息用於調試連接,驗證和配置問題。
-c cipher
以cipher將數據傳輸進行加密,這個選項將直接傳遞給ssh。
-F ssh_config
指定一個替代的ssh配置文件,此參數直接傳遞給ssh。
-i identity_file
從指定文件中讀取傳輸時使用的密鑰文件,此參數直接傳遞給ssh。
-l limit
限定用戶所能使用的帶寬,以Kbit/s為單位。
-o ssh_option
如果習慣於使用ssh_config(5)中的參數傳遞方式,
-P port 注意是大寫的P, port是指定數據傳輸用到的埠號
-S program
指定加密傳輸時所使用的程序。此程序必須能夠理解ssh(1)的選項
scp命令的實際應用
本地復制遠程文件:(把遠程的文件復制到本地)
scp [email protected]:/val/test/test.tar.gz /val/test/test.tar.gz
遠程復制本地文件:(把本地的文件復制到遠程主機上)
scp /val/test.tar.gz [email protected]:/val/test.tar.gz
本地復制遠程目錄:(把遠程的目錄復制到本地)
scp -r [email protected]:/val/test/ /val/test/
遠程復制本地目錄:(把本地的目錄復制到遠程主機上)
scp -r /val/ [email protected]:/val/
註:復制的是目錄的話就要加-r參數
當同時有多個伺服器的文件要復制到本地目錄:
scp [email protected]:/var/cp1.tar.gz [email protected]:/var/cp2.tar.gz /var/tmp/
注意:最後面的一個必需是目錄,前面的必須是文件,才能成功批量復制,復制中會提示多次輸入密碼。
② linux中ssh如何遠程執行一條命令,而且不登錄遠程伺服器
ssh [email protected] 'command ...'
scp [email protected]:/remote/path /local/path
scp /local/path [email protected]:/remote/path
- X forward
ssh -X [email protected]
xcommand ...
- Tunnel / Portforward
ssh -L 1234:remote.machine:4321 [email protected]
ssh -R 1234:local.machine:4321 [email protected]
ssh -L 1234:other.machine:4321 [email protected]
# vi /etc/ssh/sshd_config
PermitRootLogin no
# vi /etc/ssh/sshd_config
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication no
# service sshd restart
# su - user1
$ mkdir ~/.ssh 2>/dev/null
$ chmod 700 ~/.ssh
$ touch ~/.ssh/authorized_keys
$ chmod 644 ~/.ssh/authorized_keys
登入端:
$ ssh-keygen -t rsa
(按三下 enter 完成﹔不需設密碼,除非您會用 ssh-agent 。)
$ scp ~/.ssh/id_rsa.pub [email protected]:id_rsa.pub
(若是 windows client, 可用 puttygen.exe 產生 public key,
然後復制到 server 端後修改之, 使其內容成為單一一行.)
回到 server 端:
$ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
$ rm ~/id_rsa.pub
$ exit
# vi /etc/pam.d/su
auth required /lib/security/$ISA/pam_wheel.so use_uid
# visudo
%wheel ALL=(ALL) ALL
# gpasswd -a user1 wheel
# vi /etc/pam.d/sshd
auth required pam_listfile.so item=user sense=allow file=/etc/ssh_users ōnerr=fail
# echo user1 >> /etc/ssh_users
③ SSH遠程操作與埠轉發的原理
SSH不僅可以用於遠程主機登錄,還可以直接在遠程主機上執行操作。
上一節的操作,就是一個例子:
單引號中間的部分,表示在遠程主機上執行的操作;後面的輸入重定向,表示數據通過SSH傳向遠程主機。
這就是說,SSH可以在用戶和遠程主機之間,建立命令和數據的傳輸通道,因此很多事情都可以通過SSH來完成。
下面看幾個例子。
【例1】
將 HOME/src/目錄。
【例2】
將遠程主機$HOME/src/目錄下面的所有文件,復制到用戶的當前目錄。
【例3】
查看遠程主機是否運行進程httpd。
既然SSH可以傳送數據,那麼我們可以讓那些不加密的網路連接,全部改走SSH連接,從而提高安全性。
假定我們要讓8080埠的數據,都通過SSH傳向遠程主機,命令就這樣寫:
SSH會建立一個socket,去監聽本地的8080埠。一旦有數據傳向那個埠,就自動把它轉移到SSH連接上面,發往遠程主機。可以想像,如果8080埠原來是一個不加密埠,現在將變成一個加密埠。
有時,綁定本地埠還不夠,還必須指定數據傳送的目標主機,從而形成點對點的"埠轉發"。為了區別後文的"遠程埠轉發",我們把這種情況稱為"本地埠轉發"(Local forwarding)。
假定host1是本地主機,host2是遠程主機。由於種種原因,這兩台主機之間無法連通。但是,另外還有一台host3,可以同時連通前面兩台主機。因此,很自然的想法就是,通過host3,將host1連上host2。
我們在host1執行下面的命令:
命令中的L參數一共接受三個值,分別是"本地埠:目標主機:目標主機埠",它們之間用冒號分隔。這條命令的意思,就是指定SSH綁定本地埠2121,然後指定host3將所有的數據,轉發到目標主機host2的21埠(假定host2運行FTP,默認埠為21)。
這樣一來,我們只要連接host1的2121埠,就等於連上了host2的21埠。
"本地埠轉發"使得host1和host3之間彷彿形成一個數據傳輸的秘密隧道,因此又被稱為"SSH隧道"。
下面是一個比較有趣的例子。
它表示將本機的5900埠綁定host3的5900埠(這里的localhost指的是host3,因為目標主機是相對host3而言的)。
另一個例子是通過host3的埠轉發,ssh登錄host2。
這時,只要ssh登錄本機的9001埠,就相當於登錄host2了。
上面的-p參數表示指定登錄埠。
既然"本地埠轉發"是指綁定本地埠的轉發,那麼"遠程埠轉發"(remote forwarding)當然是指綁定遠程埠的轉發。還是接著看上面那個例子,host1與host2之間無法連通,必須藉助host3轉發。但是,特殊情況出現了,host3是一台內網機器,它可以連接外網的host1,但是反過來就不行,外網的host1連不上內網的host3。這時,"本地埠轉發"就不能用了,怎麼辦?
解決辦法是,既然host3可以連host1,那麼就從host3上建立與host1的SSH連接,然後在host1上使用這條連接就可以了。
我們在host3執行下面的命令:
R參數也是接受三個值,分別是"遠程主機埠:目標主機:目標主機埠"。這條命令的意思,就是讓host1監聽它自己的2121埠,然後將所有數據經由host3,轉發到host2的21埠。由於對於host3來說,host1是遠程主機,所以這種情況就被稱為"遠程埠綁定"。
綁定之後,我們在host1就可以連接host2了:
這里必須指出,"遠程埠轉發"的前提條件是,host1和host3兩台主機都有sshD和ssh客戶端。
SSH還有一些別的參數,也值得介紹。
N參數,表示只連接遠程主機,不打開遠程shell;T參數,表示不為這個連接分配TTY。這個兩個參數可以放在一起用,代表這個SSH連接只用來傳數據,不執行遠程操作。
f參數,表示SSH連接成功後,轉入後台運行。這樣一來,你就可以在不中斷SSH連接的情況下,在本地shell中執行其他操作。
要關閉這個後台連接,就只有用kill命令去殺掉進程。