SCP远程传输脚本

1 背景及目的

  开发编译好的代码不能在本地运行,需要通过scp传输到实验板上跑。且中间还要经过一次跳板机的中转传输,过于繁琐,浪费一部分开发时间。尝试编写脚本以减少开发中通过scp命令传输时的工作。
 

2 过程

2.1 编写脚本

  编写脚本如下

#!/bin/bash

usr_target_host="U1@I1"

local_dir_dir="P1"
target_dir_dir="P2"

local_dir_lib="P3"
target_dir_lib="P4"

if [ "$#" -lt 2 ]; then
    echo "Usage: $0 <dir_flag> <lib_flag>"
    echo "  dir_flag: 1 to copy directory"
    echo "  lib_flag: 1 to copy library"
    exit 1
fi

dir_flag=$1
lib_flag=$2

if [ "$dir_flag" == "1" ]; then
    scp -r $local_dir_dir/D1 $usr_target_host:$target_dir_dir
fi

if [ "$lib_flag" == "1" ]; then
    scp $llocal_dir_lib/L1 $usr_target_host:$target_dir_lib
fi

  解释每一段的含义:


#!/bin/bash

  表示这是一个Bash脚本文件,让计算机使用Bash脚本文件的规则来理解此文件。


usr_target_host="U1@I1"

  目标host的用户名及IP,将U1替换为你要传输到的远端的用户名,I1替换对需要传输到的远端的IP。


local_dir_dir="P1"
target_dir_dir="P2"

local_dir_lib="P3"
target_dir_lib="P4"

  local_XX:要传输的文件来源的路径。
  target_XX:要传输的文件去向的路径。
  因为使用编写的动态库,所以要同时传输不同路径下的生成文件夹和库到不同的路径。如果一次只需要传输一份文件,一个路径即可。


if [ "$#" -lt 2 ]; then
    echo "Usage: $0 <dir_flag> <lib_flag>"
    echo "  dir_flag: 1 to copy directory"
    echo "  lib_flag: 1 to copy library"
    exit 1
fi

  运行时的输入选项,接受两个参数。
    第一个参数为1代表需要传输文件夹。
    第二个参数为1代表需要传输文件。
  如果参数不满足则退出。
  添加输入参数功能是因为,文件夹传输的时间花费远大于库传输的时间,当只需要传输库时会浪费大量的事件在传输文件夹上。如果无此需求,可省略。


dir_flag=$1
lib_flag=$2

  用两个变量接收输入的参数。如果无输入参数的需求,可省略。


if [ "$dir_flag" == "1" ]; then
    scp -r $local_dir_dir/D1 $usr_target_host:$target_dir_dir
fi

if [ "$lib_flag" == "1" ]; then
    scp $llocal_dir_lib/L1 $usr_target_host:$target_dir_lib
fi

  通过对输入参数的判断,选择是否执行对应的scp命令。
  将D1或L1替换为需要传输文件的具体的文件名。
  通过scp传输文件夹需要增加-r选项。
  如果一次只需要传输一份文件,一个scp命令即可。


  当需求不复杂,只需要通过脚本一次传输一份文件,可简化为:

#!/bin/bash

usr_target_host="U1@I1"

local_dir="P1"
target_dir="P2"

scp $local_dir/F1 $usr_target_host:$target_dir

2.2 设置ssh密钥对登录

  在编写好脚本后运行,会需要登录密码。可以通过设置密钥对登录的方式来规避对密码的输入

客户端设置

  生成ssh密钥对,在终端输入:

ssh-keygen -t rsa

  使用默认文件夹,安全要求不高的环境,建议不设置密码。
  将公钥复制到远程服务器。在终端输入:

ssh-copy-id U@I

   U代表远端服务器用户名,I代表远端服务器IP。
  这里需要输入一次远端服务器的密码。
  此时客户端的设置就完成了。
  有设置成功的提示后,可尝试ssh指令进行登录。如果登录不成功,说明还需要对远端服务器端进行修改。

服务器设置

  登录远端服务器,修改/etx/ssh下的sshd_config文件。
  添加:

PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

  检查~/.ssh下的authorized_keys文件夹是否存在客户端添加好的密钥。
  服务器端的设置也完成了。
  可以尝试运行脚本传输文件。

3 建议

建议1

  在对服务器端进行修改时,将原sshd_config进行一次备份,且最好保留一个连接上远端服务器的终端作为备用。同时与同事或同学沟通一下,确保在修改的过程中远端服务器不会被关闭或重启(如果使用了跳板机,也需要保证跳板机不会被关闭或者重启),防止在设置的过程中,因sshd_config修改不当,导致无法通过ssh登录再次修改sshd_config的问题。每次修改完sshd_config后,开启新的终端尝试ssh能否不需要密码进行登录。若无法登录,则赶紧将sshd_config还原,再去排查问题。

建议2

  在对服务器端修改完后,需要修改各级文件夹权限:

  • 修改.ssh/authorized_keys文件权限不高于600
  • 修改.ssh目录权限不高于700
  • 修改.ssh上级目录权限不高于755
使用scp命令传输文件夹可以通过以下步骤完成: 1. 打开终端或命令提示符窗口。 2. 输入以下命令格式来传输文件夹:scp -r folder1 folder2 usrname@ip:/folder/,其中folder1和folder2是待传输的一个或多个文件夹的路径,usrname是远程服务器的用户名,ip是远程服务器的IP地址,/folder/是目标文件夹的路径。例如:scp -r myfolder1 myfolder2 root@192.168.172.104:/dst/folder/。 3. 执行命令后,系统会提示你输入远程服务器的密码。 4. 输入密码后,文件夹将被传输到指定的远程服务器目录中。 请注意,如果远程服务器防火墙有为scp命令设置了指定的端口,你需要在命令中使用-P参数来设置命令的端口号。例如:scp -P 22 -r myfolder1 myfolder2 root@192.168.172.104:/dst/folder/。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [scp 文件传输命令详解](https://blog.youkuaiyun.com/lansebingxuan/article/details/125815124)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [如何用 scp命令创建文件夹](https://blog.youkuaiyun.com/weixin_34375356/article/details/114068246)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值