如何在使用Shell脚本建立的SFTP连接中进行CD操作

4
在我的脚本中,我创建了一个SFTP连接。
之前我从用户那里读取了一些目录值,一旦建立了SFTP连接,我尝试cd到用户给出的那个目录。
但是它不起作用,可能是因为提示符进入了已建立SFTP连接的服务器。
在这种情况下,如何使其工作?

1
SFTP协议没有"当前目录"的概念,因此您无法在其中进行"cd"操作。控制台SFTP客户端在内部模拟chdir命令。 - Eugene Mayevski 'Callback
4个回答

6

我也遇到了这个问题,并找到了解决方案。解决方案就在sftp的man页面中。在man页面中,你会发现使用sftp的格式如下:

sftp [options] [user@]host[:dir[/]]

实际上,这里提供了两种格式,但我想使用的是这一种,并且它起作用了。

那么,你需要做什么呢?你只需按照所见的方式提供username@host,然后在脚本中不加任何空格就跟着:和你想要更改到的客户端/远程服务器中的路径,就可以了。以下是一个实际示例:

sftp user@host:/path/ 

2
如果您的脚本确实像您在此页面的某处所述那样执行,请按照以下步骤操作:
sftp $user@$host cd $directory

然后尝试做其他事情,比如:

sftp $user@$host FOO

由于您执行了新命令,将创建到SFTP服务器的新连接,因此该命令FOO不会在相同的$directory目录中执行。

您可以使用sftp的“batchfile”选项,即构建一个包含所有您想让sftp在一个连接上执行的命令的文件,例如:

$ cat commands.txt
cd foo/bar
put foo.tgz
lcd /tmp/
get foo.tgz

然后,您将能够告诉sftp在一个连接中执行这些命令,只需执行:

sftp -b commands.txt $user@$host

因此,我建议您的解决方案如下:

  • 根据用户的输入,创建一个临时文本文件,其中包含要在一个SFTP连接上执行的所有命令,然后
  • 使用该临时文本文件作为“批处理文件”执行sftp命令

您的脚本将会执行以下操作:

echo "Directory in which to go:"
read directory
temp=$( mktemp /tmp/FOOXXX )
echo "" > $temp
echo "cd $directory" >> $temp
# other commands
sftp -b $temp $user@$host
rm $temp

0

如果你想要改变机器的目录,请尝试使用 lcd 命令


如果这是我的脚本的一部分 sftp $uid@$ip cd $path
  • 一旦执行了sftp命令,提示符就会转到执行sftp命令的服务器。因此,它不会执行脚本下一行中存在的cd / lcd命令。
- vvshack

-2
以什么方式它没有工作?要在远程服务器上更改目录,您可以使用“cd”命令。要在本地服务器上更改目录,您可以使用“lcd”命令。请阅读“man sftp”。

如果这是我的脚本的一部分 sftp $uid@$ip cd $path - 一旦执行了sftp命令,提示符就会转到执行sftp命令的服务器上。因此,它不会执行脚本下一行中存在的cd / lcd命令。 - vvshack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接