Linux 使用 ssh 检查远程主机上是否存在文件
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/12845206/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
check if file exists on remote host with ssh
提问by stdcerr
I would like to check if a certain file exists on the remote host. I tried this:
我想检查远程主机上是否存在某个文件。我试过这个:
$ if [ ssh user@localhost -p 19999 -e /home/user/Dropbox/path/Research_and_Development/Puffer_and_Traps/Repeaters_Network/UBC_LOGS/log1349544129.tar.bz2 ] then echo "okidoke"; else "not okay!" fi
-sh: syntax error: unexpected "else" (expecting "then")
采纳答案by Florin Stingaciu
Here is a simple approach:
这是一个简单的方法:
#!/bin/bash
USE_IP='-o StrictHostKeyChecking=no [email protected]'
FILE_NAME=/home/user/file.txt
SSH_PASS='sshpass -p password-for-remote-machine'
if $SSH_PASS ssh $USE_IP stat $FILE_NAME \> /dev/null 2\>\&1
then
echo "File exists"
else
echo "File does not exist"
fi
You need to install sshpasson your machine to work it.
您需要在您的机器上安装sshpass才能使用它。
回答by Mat
You're missing ;
s. The general syntax if you put it all in one line would be:
你缺少;
s。如果将所有内容放在一行中,则一般语法是:
if thing ; then ... ; else ... ; fi
The thing
can be pretty much anything that returns an exit code. The then
branch is taken if that thing
returns 0, the else
branch otherwise.
该thing
可几乎任何返回退出代码。该then
如果分支被采用thing
返回0,该else
分支除外。
[
isn't syntax, it's the test
program (check out ls /bin/[
, it actually exists, man test
for the docs – although can also have a built-in version with different/additional features.) which is used to test various common conditions on files and variables. (Note that [[
on the other hand issyntax and is handled by your shell, if it supports it).
[
不是语法,而是test
程序(检查ls /bin/[
,它实际上存在,man test
对于文档 - 尽管也可以具有具有不同/附加功能的内置版本。)用于测试文件和变量的各种常见条件。(请注意,[[
另一方面是语法并由您的 shell 处理,如果它支持的话)。
For your case, you don't want to use test
directly, you want to test something on the remote host. So try something like:
对于您的情况,您不想test
直接使用,而是想在远程主机上测试某些内容。所以尝试这样的事情:
if ssh user@host test -e "$file" ; then ... ; else ... ; fi
回答by JP Lew
In addition to the answers above, there's the shorthand way to do it:
除了上面的答案之外,还有一种速记方法:
ssh -q $HOST [[ -f $FILE_PATH ]] && echo "File exists" || echo "File does not exist";
-q
is quiet mode, it will suppress warnings and messages.
-q
是安静模式,它将抑制警告和消息。
As @Mat mentioned, one advantage of testing like this is that you can easily swap out the -f
for any test operator you like: -nt
, -d
, -s
etc...
作为@Mat提到,测试这样的一个好处是,你可以很容易地换出-f
任何测试操作你喜欢:-nt
,-d
,-s
等...
Test Operators:http://tldp.org/LDP/abs/html/fto.html
测试运营商:http : //tldp.org/LDP/abs/html/fto.html
回答by None
ssh -q $HOST [[ -f $FILE_PATH ]] && echo "File exists"
The above will run the echo command on the machine you're running the ssh command from. To get the remote server to run the command:
以上将在您运行 ssh 命令的机器上运行 echo 命令。要让远程服务器运行命令:
ssh -q $HOST "[[ ! -f $FILE_PATH ]] && touch $FILE_PATH"
回答by tarok
You can specify the shell to be used by the remote host locally.
您可以在本地指定远程主机要使用的 shell。
echo 'echo "Bash version: ${BASH_VERSION}"' | ssh -q localhost bash
And be careful to (single-)quote the variables you wish to be expanded by the remote host; otherwise variable expansion will be done by your local shell!
并小心(单)引用您希望由远程主机扩展的变量;否则变量扩展将由您的本地 shell 完成!
# example for local / remote variable expansion
{
echo "[[ $- == *i* ]] && echo 'Interactive' || echo 'Not interactive'" |
ssh -q localhost bash
echo '[[ $- == *i* ]] && echo "Interactive" || echo "Not interactive"' |
ssh -q localhost bash
}
So, to check if a certain file exists on the remote host you can do the following:
因此,要检查远程主机上是否存在某个文件,您可以执行以下操作:
host='localhost' # localhost as test case
file='~/.bash_history'
if `echo 'test -f '"${file}"' && exit 0 || exit 1' | ssh -q "${host}" sh`; then
#if `echo '[[ -f '"${file}"' ]] && exit 0 || exit 1' | ssh -q "${host}" bash`; then
echo exists
else
echo does not exist
fi
回答by karni
Can't get much simpler than this :)
没有比这更简单的了:)
ssh host "test -e /path/to/file"
if [ $? -eq 0 ]; then
# your file exists
fi
As suggested by dimo414, this can be collapsed to:
按照 dimo414 的建议,这可以折叠为:
if ssh host "test -e /path/to/file"; then
# your file exists
fi
回答by estani
one line, proper quoting
一行,正确引用
ssh remote_host test -f "/path/to/file" && echo found || echo not found
回答by miguialberto
I wanted also to check if a remote file exist but with RSH. I have tried the previous solutions but they didn't work with RSH.
我还想检查远程文件是否存在但带有 RSH。我已经尝试过以前的解决方案,但它们不适用于 RSH。
Finally, I did I short function which works fine:
最后,我做了我的简短功能,效果很好:
function existRemoteFile ()
{
REMOTE=
FILE=
RESULT=$(rsh -l user $REMOTE "test -e $FILE && echo \"0\" || echo \"1\"")
if [ $RESULT -eq 0 ]
then
return 0
else
return 1
fi
}
回答by Abhimanu Kumar
On CentOS machine, the oneliner bash that worked for me was:
在 CentOS 机器上,对我有用的 oneliner bash 是:
if ssh <servername> "stat <filename> > /dev/null 2>&1"; then echo "file exists"; else echo "file doesnt exits"; fi
It needed I/O redirection (as the top answer) as well as quotes around the command to be run on remote.
它需要 I/O 重定向(作为最佳答案)以及要在远程运行的命令周围的引号。
回答by rouble
Test if a file exists:
测试文件是否存在:
HOST="example.com"
FILE="/path/to/file"
if ssh $HOST "test -e $FILE"; then
echo "File exists."
else
echo "File does not exist."
fi
And the opposite, test if a file does not exist:
相反,测试文件是否不存在:
HOST="example.com"
FILE="/path/to/file"
if ! ssh $HOST "test -e $FILE"; then
echo "File does not exist."
else
echo "File exists."
fi