情况很简单:
我可以用 ssh my_remote_user@remote_server
ssh 到远程服务器,并希望复制一些文件,即 /var/www/docs/web.config.txt
到本地。
问题是/var/www/docs/web.config.txt
像userA:userA
一样拥有所有权。我可以通过以下方式以该用户身份访问
$ su - userA
$ Password: userApwd
考虑到这一点,我可以:
1 - 将/var/www/docs/web.config.txt
复制到/tmp
文件夹并将所有权更改为my_remote_user
2 - 从远程复制到本地 从远程/tmp
目录
我的问题:
通过bash
、python
或其他语言,我可以自动执行此步骤吗?
注意:有了
expect
,我似乎可以su - userA
然后在远程服务器中插入密码,但是没有发生像cp /var/www/docs/web.config.txt
这样的后续命令......
谢谢
如果你在 Linux 服务器上,你将需要使用 SCP 命令,下面是示例命令。
scp user@host:目录/源文件 目标文件scp -r user@host:directory/SourceFolder TargetFolder
您可以将su
与参数一起使用-c
来运行任意命令,即:
su -c "scp /var/www/docs/web.config.txt your_user@client_machine:" userA
您是否可以使用 scp 和 userA 凭据登录到远程服务器,即代替:
scp my_remote_user@remote_server:/remote/dir local_dir
用:
scp userA@remote_server:/remote/dir local_dir
对不起,时间过了太多!
感谢您的所有回复,但最后我使用 expect
找到了答案,但以我假设的不同方式......
需要明确的是,我必须运行一个expect script
但只能在我的本地主机中运行,而我想运行期望进入远程服务器......
以下是我的脚本,希望对某人有所帮助:
1 参数化脚本
说remoteActions.sh
#!/usr/bin/expect --
set timeout -1
# ssh connection
spawn ssh $env(fsUser)@$env(fsHost)
expect "password:"
send "$env(fsPass)r"
expect "sh"
# switch to apache user
send "su - apacher"
expect "Password: "
send "$env(fsApachePass)r"
expect -re ".*apache.*"
# create folder if not exists
send "[ -d /tmp/$env(fsRemoteTmpDir) ] || mkdir -m 777 -p /tmp/$env(fsRemoteTmpDir)r"
expect -re ".*apache.*"
# copy folder via rsync but exclude some dirs
send "rsync -a $env(fsExcludeFromRemoteDir) $env(fsRemoteDir) /tmp/$env(fsRemoteTmpDir)r"
expect -re ".*apache.*"
# change permissions
send "chmod -R 777 /tmp/$env(fsRemoteTmpDir)r"
expect -re ".*apache.*"
send "exitrn"
2 具有配置的真实脚本
#!/bin/bash
### File System
export fsUser='sshuser'
export fsHost='remoteip'
export fsPass='remotepass'
export fsApachePass='apache'
export fsRemoteDir='/var/www/webapp'
export fsExcludeFromRemoteDir='--exclude=img/ --exclude=upload/'
export fsRemoteTmpDir='/bak'
# copy remote folder into remote directory
./remoteActions.sh
3 我的把戏
使用此脚本,我可以使用我的标准用户访问 {fsRemoteTmpDir}
,它现在有 777 个权限,所以我还有两个操作要做:
- 运行
scp
以从远程复制到本地 - 通过
ssh
命令或使用另一个expect
脚本删除远程{fsRemoteTmpDir}
我不发布1
和2
,因为我的问题/答案的核心在remoteActions.sh
。
谢谢你们!!